给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回其自底向上的层次遍历为:
[
[15,7],
[9,20],
[3]
]
法一:栈队列
用一个stack<queue<TreeNode*>>的结构将树装进去
然后将栈不断pop,装到要返回的vector<vector<int>>中
比如:
code:
/**
* 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> > ret;
if(root == NULL)
return ret;
stack<queue<TreeNode*> > sac;
queue<TreeNode*> que;
que.push(root);
sac.push(que);
while(1)
{
que = sac.top();
queue<TreeNode*> t;
while(!que.empty())
{
TreeNode *temp = que.front();
que.pop();
if(temp != NULL)
{
if(temp -> left != NULL)
t.push(temp -> left);
if(temp -> right != NULL)
t.push(temp -> right);
}
}
if(t.empty())
break;
else
sac.push(t);
}
while(!sac.empty())
{
que = sac.top();
sac.pop();
vector<int> tp;
while(!que.empty())
{
TreeNode *temp = que.front();
que.pop();
if(temp != NULL)
{
tp.push_back(temp->val);
}
}
ret.push_back(tp);
}
return ret;
}
};
效率:
100%
法二:双队列
code:
/**
* 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> > ret;
if(root == NULL)
return ret;
queue<TreeNode*> t1,t2;
t2.push(root);
while(1)
{
t1 = t2;
while(!t2.empty())
t2.pop();
vector<int> vct;
while(!t1.empty())
{
TreeNode *temp = t1.front();
t1.pop();
if(temp != NULL)
{
vct.push_back(temp -> val);
if(temp -> left != NULL)
t2.push(temp -> left);
if(temp -> right != NULL)
t2.push(temp -> right);
}
}
ret.insert(ret.begin(),vct);
if(t2.empty())
break;
}
return ret;
}
};
效率:
100%