题目
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7返回其自底向上的层次遍历为:
[ [15,7], [9,20], [3] ]
题解:
乍一看,好像需要很复杂的遍历,需要我们先到最底层,然后再往上整。但是我们会发现这个其实和按层次遍历的结果刚好相反,那么我们可以先按照层次遍历树,然后再将结果取反就行(或者先用一个栈存储结果)。
vector<vector<int>> levelOrderBottom(TreeNode* root) {
//保存按照层次遍历的结果
vector<vector<int> > res;
//存储最终结果
vector<vector<int> > r;
//存储每一层的结果
vector<int> tmp;
if(root==NULL)
return res;
queue<TreeNode* > que;
que.push(root);
//记录每层的个数,这样就不用再开一个临时队列存储子节点,而是直接将子节点放到que中
int i = que.size();
while(!que.empty())
{
TreeNode* head = que.front();
tmp.push_back(head->val);
que.pop();
i--;
//添加左右子节点
if(head->left!=NULL)
{
que.push(head->left);
}
if(head->right!=NULL)
{
que.push(head->right);
}
//该层遍历结束
if(i==0)
{
res.push_back(tmp);
tmp.clear();
i = que.size();
}
}
//将结果取反
for(int i=res.size()-1;i>=0;i--)
{
r.push_back(res[i]);
}
return r;
}
京公网安备 11010502036488号