题目描述
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [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;
}