leetcode 107.二叉树的层次遍历-ii(binary tree level order traversal ii)C语言

10 篇文章 0 订阅

leetcode 107.二叉树的层次遍历-ii(binary tree level order traversal ii)C语言

1.description

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

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

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

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

返回其层次遍历结果:

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

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 getHeight(struct TreeNode* root){
    int lhigh = 0;
    int rhigh = 0;

    if(root == NULL){
        return 0;
    }

    lhigh = getHeight(root->left);
    rhigh = getHeight(root->right);

    return (lhigh > rhigh) ? (lhigh + 1) : (rhigh + 1); 
}


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

    int height = getHeight(root);
    *returnSize = height;

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

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

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

    // pop一个节点,输出其值,将左节点和右节点push,不断循环至队空
    while(!queue_is_empty(queue)){
        height--;
        ans[height] = (int*)malloc(sizeof(int)*REALLOC_STEP);
        int levelid = 0;
        int size = queue->size;
        (*returnColumnSizes)[height] = size;
        while(size--){
            dequeue(queue, (void *)&node);

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

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

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

    free(queue);

    return ans;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值