学渣带你刷Leetcode0107二叉树的层次遍历 II

题目描述

给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

例如:
给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回其自底向上的层次遍历为:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

白话题目:
 

算法:

 

详细解释关注 B站  【C语言全代码】学渣带你刷Leetcode 不走丢 https://www.bilibili.com/video/BV1C7411y7gB

C语言完全代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */


/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
#define MAXSIZE 1000
int** levelOrderBottom(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
    *returnSize = 0;
    if (!root) return NULL;
    int **ret = (int **)malloc(sizeof(int *) * MAXSIZE);
    *returnColumnSizes = (int *)malloc(sizeof(int) * MAXSIZE);

    struct TreeNode *queue[MAXSIZE];
    int rear = 0, front = 0, capacity;
    queue[rear] = root;
    rear = (rear + 1) % MAXSIZE;
    // 1.层序遍历操作
    struct TreeNode *elem;
    while (front != rear) {  // 直到队列为空
        capacity = (rear + MAXSIZE - front) % MAXSIZE;  // 队列元素个数
        ret[*returnSize] = (int *)malloc(sizeof(int) * capacity);
        for (int i = 0; i < capacity; i++) {
            elem = queue[front];  // 获取元素
            ret[*returnSize][i] = elem->val;
            front = (front + 1) % MAXSIZE;  // 队列头部指针移动
            if (elem->left) {
                queue[rear] = elem->left;
                rear = (rear + 1) % MAXSIZE;
            }
            if (elem->right) {
                queue[rear] = elem->right;
                rear = (rear + 1) % MAXSIZE;
            }
        }
        returnColumnSizes[0][(*returnSize)++] = capacity;  // 此列多少元素个数
    }
    // 3.翻转结果与returnColSize
    int *arr_tmp, num_tmp;  // 每层元素个数
    for (int lo = 0, hi = (*returnSize) - 1; lo < hi; lo++, hi--) {
        arr_tmp = ret[lo];
        ret[lo] = ret[hi];
        ret[hi] = arr_tmp;
        num_tmp = returnColumnSizes[0][hi];
        returnColumnSizes[0][hi] = returnColumnSizes[0][lo];
        returnColumnSizes[0][lo] = num_tmp;
    }
    return ret;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章