C语言刷题:NC15 求二叉树的层序遍历

#define NODE_NUM        1500
#define LEVEL_NODE_NUM  150

typedef struct queue {
    const struct TreeNode* arr[NODE_NUM];
    int head, tail;
} queue_t;
 
void enqueue(queue_t* queue, const struct TreeNode* root)
{
    queue->arr[queue->tail++] = root;
}

const struct TreeNode* dequeue(queue_t* queue)
{
    return queue->arr[queue->head++];
}

bool is_empty(const queue_t* queue)
{
    return queue->head == queue->tail;
}

int size(const queue_t* queue)
{
    return queue->tail - queue->head;
}

typedef struct result {
    int* ret[NODE_NUM];
    int col[NODE_NUM];
    int raw;
} result_t;

void bfs(struct TreeNode* root, queue_t* queue, result_t* result)
{
    if (!root)
        return;

    enqueue(queue, root);
    while (!is_empty(queue))
    {
        int cnt = size(queue);
        for(int i = 0; i < cnt; i++)
        {
            const struct TreeNode* node = dequeue(queue);
            result->ret[result->raw][i] = node->val;
            if (node->left)
                enqueue(queue, node->left);
            if (node->right)
                enqueue(queue, node->right);
        }
        result->col[result->raw++] = cnt;
    }    
}

int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes)
{
    result_t* res = (result_t*)malloc(sizeof(result_t));
    for(int i = 0; i < NODE_NUM; i++)
        res->ret[i] = (int*)malloc(LEVEL_NODE_NUM * sizeof(int));
    res->raw = 0;

    queue_t queue = {.head = 0, .tail = 0};
    bfs(root, &queue, res);

    *returnSize = res->raw;
    *returnColumnSizes = res->col;
    return res->ret;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值