題目描述
給定一個二叉樹,返回其節點值自底向上的層次遍歷。 (即按從葉子節點所在層到根節點所在的層,逐層從左向右遍歷)
例如:
給定二叉樹 [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;
}