學渣帶你刷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;
}

 

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