leetcode 102.二叉树的层序遍历(binary tree level order traversal)C语言

leetcode 102.二叉树的层序遍历(binary tree level order traversal)C语言

1.description

https://leetcode-cn.com/problems/binary-tree-level-order-traversal/description/

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。

示例:
二叉树:[3,9,20,null,null,15,7],

⁠   3⁠  / ⁠ 9  20⁠   /  ⁠  15   7

返回其层次遍历结果:

[
⁠ [3],
⁠ [9,20],
⁠ [15,7]
]

2.solution

#define REALLOC_STEP 10

#define queue_is_empty(queue) (queue->head == NULL)

typedef struct list_node{
    void *val;
    struct list_node *next;
}Node;

typedef struct list_queue{
    Node *head;
    Node *tail;
    int size;
}Queue;


// 创建初始队列
Queue *queue_create(){
    Queue *queue = NULL;
    queue = (Queue*)malloc(sizeof(Queue));
    if(queue == NULL){
        return NULL;
    }

    queue->head = NULL;
    queue->tail = NULL;
    queue->size = 0;

    return queue;
}


// 入队
void enqueue(Queue *queue, void *val){
    Node *node = NULL;
    node = (Node*)malloc(sizeof(Node));
    node->val = val;
    node->next = NULL;

    if(queue_is_empty(queue)){
        queue->head = node;
    }else{
        queue->tail->next = node;
    }
    queue->tail = node;
    (queue->size)++;
}


// 出队
int dequeue(Queue *queue, void **val){
    if(queue_is_empty(queue)){
        return -1;
    }

    *val = queue->head->val;
    Node *p = queue->head;
    queue->head = p->next;

    // ***如果出队的是最后一个节点,记得把tail置为NULL
    if(queue->head == NULL){
        queue->tail = NULL;
    }

    (queue->size)--;

    free(p);
    return 0;
}


int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
    if(root == NULL){
        *returnSize = 0;
        return NULL;
    }

    int **ans = (int**)malloc(sizeof(int*)*REALLOC_STEP);
    *returnColumnSizes = (int*)malloc(sizeof(int)*REALLOC_STEP);
    memset(*returnColumnSizes, 0, sizeof(int)*REALLOC_STEP);

    Queue *queue = NULL;
    struct TreeNode *node = NULL;
    queue = queue_create();

    // 根节点先入队
    enqueue(queue, (void *)root);

    int level = 0;
    // pop一个节点,输出其值,将左节点和右节点push,不断循环至队空
    while(!queue_is_empty(queue)){
        if(level != 0 && level % REALLOC_STEP == 0){
            ans = (int**)realloc(ans, sizeof(int*)*(level+REALLOC_STEP));
            *returnColumnSizes = (int*)realloc(*returnColumnSizes, sizeof(int)*(level+REALLOC_STEP));
            for(int i=level; i<level+REALLOC_STEP; ++i){
                (*returnColumnSizes)[i] = 0;
            }
        }

        ans[level] = (int*)malloc(sizeof(int)*REALLOC_STEP);
        int levelid = 0;
        int size = queue->size;
        (*returnColumnSizes)[level] = size;
        while(size--){
            dequeue(queue, (void *)&node);

            if(levelid != 0 && levelid % REALLOC_STEP == 0){
                ans[level] = (int*)realloc(ans[level], sizeof(int)*(levelid+REALLOC_STEP));
            }

            ans[level][levelid++] = node->val;

            if(node->left){
                enqueue(queue, (void *)node->left);
            }
            if(node->right){
                enqueue(queue, (void *)node->right);
            }
        }
        level++;
    }

    *returnSize = level;

    free(queue);

    return ans;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值