【天天一題】LeetCode 0107. 自底向上層遍歷二叉樹


開源地址:點擊該連接


題目描述

*     給定一個二叉樹,返回其節點值自底向上的層次遍歷。
*     即按從葉子節點所在層到根節點所在的層,逐層從左向右遍歷
* 
* 例如:
*     給定二叉樹 [3,9,20,null,null,15,7]
*         3
*        / \
*       9  20
*         /  \
*        15   7
*     返回其自底向上的層次遍歷爲:
*     [
*       [15,7],
*       [9,20],
*       [3]
*     ]
*

解題思路

*     因爲須要按層進行組成,且是vector<vector<int>>
*     因此必須把每一個層分開記錄,另外一點就是還要實現逆序
*     分層能夠經過單獨記錄每層節點來完成,而逆序有兩種方式
*     第一種是直接正序記錄,而後再顛倒順序
*     第二種是進行遞歸記錄每層節點,最後在每層中添加數據
*     這樣第二種就省去了第一種方法中顛倒順序這步的操做
*

示例代碼

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
        if (root == NULL)
            return {};

        vector<vector<int>> res;
        vector<TreeNode *> nodes;
        nodes.push_back(root);
        do_order(nodes, res);

        return res;
    }

    void do_order(vector<TreeNode *> &nodes, vector<vector<int>> &res) {
        if (nodes.size() == 0)
            return;

        vector<TreeNode *> next_level;
        for (int i=0; i<nodes.size(); i++) {
            if (nodes[i]->left)
                next_level.push_back(nodes[i]->left);
            if (nodes[i]->right)
                next_level.push_back(nodes[i]->right);
        }

        do_order(next_level, res);
        vector<int> temp;
        for (int i=0; i<nodes.size(); i++) {
            temp.push_back(nodes[i]->val);
        }
        res.push_back(temp);
    }
};
相關文章
相關標籤/搜索