题目描述:
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [3,9,20,null,null,15,7],
返回其自底向上的层次遍历为:
[
[15,7],
[9,20],
[3]
]
方法1:使用队列实现
主要思路:
(1)这个和正常的层次遍历一个思路,使用队列实现广度优先搜索,把每一层的元素压入到当前临时数组中,最后再把临时数组压入到结果中,只不过,在最后返回前,将结果进行反序,实现从下层到上层的输出;
/**
* 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) {
//处理特殊的情形
if(root==NULL)
return vector<vector<int>>();
//队列辅助实现
queue<TreeNode*> q;
q.push(root);//先压入根节点
vector<vector<int>>res;
TreeNode* tmp=NULL;
while(!q.empty()){//终止条件为遍历完所有元素,既队列为空
vector<int> vec;//临时数组,存储当前层的元素值
int size_q=q.size();//获得当前层的元素的数量
while(size_q--){//输出当前层的元素
tmp=q.front();
q.pop();
vec.push_back(tmp->val);//将当前值压入临时数组
//将非空的左右结点压入到队列中
if(tmp->left)
q.push(tmp->left);
if(tmp->right)
q.push(tmp->right);
}
res.push_back(vec);//将当前层的临时数组结果压入到结果中
}
//反序
reverse(res.begin(),res.end());
return res;
}
};