给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其自底向上的层次遍历为:
[
[15,7],
[9,20],
[3]
]
思路1:递归
代码:
class Solution{
public List<List<Integer>>levelOrderBottom(TreeNode root){
List<List<Integer>>res=new ArrayList<>();
helper(root,0,res);
Collections.reverse(res);
return res;
}
public void helper(TreeNode root,int depth,List<List<Integer>>res){
if(root==null)
return;
if(depth+1>res.size())
res.add(new ArrayList());
res.get(depth).add(root.val);
if(root.left!=null)helper(root.left,depth+1,res);
if(root.right!=null)helper(root.right,depth+1,res);
}
}
思路2:非递归
新建两个链表用来完成队列的功能
代码:
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> result = new ArrayList();
List<TreeNode> list = new ArrayList();
if (root == null) {
return result;
}
list.add(root);
while (!list.isEmpty()) {
List<Integer> nowList = new ArrayList();//每次当前层节点都要重新初始化
List<TreeNode> nextList = new ArrayList();//初始化下一层所有节点的list
for (TreeNode cur : list) {
nowList.add(cur.val);
if (cur.left != null) {
nextList.add(cur.left);
}
if (cur.right != null) {
nextList.add(cur.right);
}
}
list = nextList;
result.add(0, nowList);//当前层所有节点的list倒插进返回结果中
}
return result;
}