给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [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;
}
};