给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [3,9,20,null,null,15,7]
,
3 / \ 9 20 / \ 15 7
返回其自自底向上的层次遍历为:
[ [15,7], [9,20], [3] ]
该题两种做法,一种就是递归,一种使用队列。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List> levelOrderBottom(TreeNode root) {
List> l=new ArrayList>();
addLevel(l,0,root);
Collections.reverse(l);
return l;
}
public void addLevel(List> list, int level, TreeNode node){
if(node==null)return ;
if(list.size()-1());
list.get(level).add(node.val);
addLevel(list,level+1,node.left);
addLevel(list,level+1,node.right);
}
}
给定一个Level的值,记录当前遍历到了那一层,如果list不够存了就new一个二元list,把这层的值都加进去。
队列的做法就是遍历整层的二叉树,没啥好说的了。
class Solution {
public List> levelOrderBottom(TreeNode root) {
List> list = new ArrayList<>();
if(root == null){
return list;
}
Queue queue = new ArrayDeque<>();
queue.offer(root);
while(!queue.isEmpty()){
//获取当前层的节点数
int levelNum = queue.size();
List subList = new ArrayList<>();
for (int i = 0; i < levelNum; i++) {
TreeNode node = queue.poll();
subList.add(node.val);
if(node.left != null){
queue.offer(node.left);
}
if(node.right != null){
queue.offer(node.right);
}
}
list.add(0,subList);
}
return list;
}
}