LeetCode領釦 #107 二叉樹的層次遍歷II(Binary-Tree-Level-Order-Traversal-II)

給定一個二叉樹,返回其節點值自底向上的層次遍歷。 (即按從葉子節點所在層到根節點所在的層,逐層從左向右遍歷)

例如:
給定二叉樹 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回其自底向上的層次遍歷爲:

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

 

思路:有丶複雜,但本質還是層次遍歷,只是每一層的數據用一個vector<int>保存,而且結果要求從後往前。主要的想法還是:先來一個空的容器vector<vector<int> >res保存結果,若樹爲空樹直接返回,否則執行算法。同樣的,設一個隊列,先將樹根入隊,然後進入循環。

首先將當前隊列的n個元素逐個取出(需要記錄個數n,這n個結點即爲這一層的結點),然後將其左結點、右節點入隊(NULL不要),同時將取出的結點保存到一個臨時容器data中。這樣內部循環結束後,隊列中的是下一層的結點,data中的是這一層的結點。將data存入棧中(方便最後回彈,從後往前)。知道隊列爲空時結束算法,返回結果。

結果:此算法勝過100.00%的cpp(還可以^-^)

/**
 * 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) 
    {
        vector<vector<int> > res;
        if( root == nullptr ) 
            return res;	

        stack<vector<int> > tmp;
        queue<TreeNode*> que;
        que.push(root);
        while( !que.empty() )
        {
            vector<int> data;
            int n = que.size();
            while( n-- ){
                TreeNode* t = que.front();
                if( t->left ) que.push(t->left);
                if( t->right) que.push(t->right);
                data.push_back(t->val);
                que.pop();		
            }
            tmp.push(data);
        }
        while( !tmp.empty() ){
            res.push_back( tmp.top() );
            tmp.pop();
        }
        return res;	    
    }
};

 

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