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