给出一棵二叉树,返回其节点值从底向上的层次序遍历(按从叶节点所在层到根节点所在的层遍历,然后逐层从左往右遍历)您在真实的面试中是否遇到过这个题?
Yes
样例
给出一棵二叉树 {3,9,20,#,#,15,7},
3
/ \
9 20
/ \
15 7
按照从下往上的层次遍历为:
[
[15,7],
[9,20],
[3]
]
标签 Expand
解题思路:
和二叉树的层次遍历一致,
我们可以设置两个队列,想象一下队列的特点,就是先进先出,首先把第0层保存在一个队列中,然后按节点访问,并把已经访问节点的左右孩子节点放在第二个队列中,当第一个队列中的所有节点都访问完成之后,交换两个节点。这样重复下去,知道所有层的节点都被访问,这样做的代价就是空间复杂度有点高
。
只需将最后的List反转即可
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param root: The root of binary tree.
* @return: buttom-up level order a list of lists of integer
*/
public ArrayList<ArrayList<Integer>> levelOrderBottom(TreeNode root) {
// write your code here
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
if(null==root) return res;
Queue<TreeNode> fQ = new LinkedList<>();
fQ.add(root);
while(fQ!=null&&fQ.size()>0){
Queue<TreeNode> sQ = new LinkedList<>();
ArrayList<Integer> depthRoot = new ArrayList<>();
while(fQ!=null&&fQ.size()>0){
TreeNode cur = fQ.poll();
depthRoot.add(cur.val);
if(cur.left!=null){
sQ.add(cur.left);
}
if(cur.right!=null){
sQ.add(cur.right);
}
}
res.add(depthRoot);
fQ = sQ;
}
return reverse(res);
}
public ArrayList<ArrayList<Integer>> reverse(ArrayList<ArrayList<Integer>> res){
ArrayList<ArrayList<Integer>> reres = new ArrayList<>();
for(int i=res.size()-1;i>=0;i--){
ArrayList<Integer> tmp = res.get(i);
reres.add(tmp);
}
return reres;
}
}