给出一棵二叉树,返回其节点值从底向上的层次序遍历(按从叶节点所在层到根节点所在的层遍历,然后逐层从左往右遍历)
样例
给出一棵二叉树 {3,9,20,#,#,15,7}
,
3 / \ 9 20 / \ 15 7
按照从下往上的层次遍历为:
[ [15,7], [9,20], [3]]
/** * 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: A tree * @return: buttom-up level order a list of lists of integer */ public List
> levelOrderBottom(TreeNode root) { // write your code here if(root == null){ return new ArrayList
>(); } List
> ans = work(levelOrderBottom(root.left),levelOrderBottom(root.right));//递归 List rootval = new ArrayList (); rootval.add(root.val); ans.add(rootval); return ans; } public List
> work(List
> left,List
>right){//将两个二维数组 从数组下面开始往上合并((1),(2,3)) ((6))结果是((1),(2,3,6)) if(left.size() == 0){ return right; } if(right.size() == 0){ return left; } int len = Math.max(right.size(),left.size()); int count = 1; List
> ans = new ArrayList
>(); for(int i =0 ;i ()); } while(count<=len){ List lv = left.size() == 0?new ArrayList ():left.remove(left.size()-1); List rv = right.size() == 0?new ArrayList ():right.remove(right.size()-1); ans.remove(len-count); ans.add(len-count,miniwork(lv,rv)); count++; } return ans; } public List miniwork(List left,List right){//作用合并两个一维数组,右边的拼到左边 if(left.size() == 0){ return right; } if(right.size() == 0){ return left; } int len = right.size(); int count = 0; while(count
这个题网上的方法,就是正常的二叉树按层遍历然后 直接数组反转,或者入栈反转
如果这么做的话 和二叉树的层次正序遍历 就没区别了。出于这个想法 ,考虑出这种做法,可能略烦琐
递归的思想 左子树和右子树 都返回一个已经排序的二维数组。 我在当前节点把两个子数的返回数据拼在一起(这里要注意,因为子树的深度不一致,那么只能先拼数组后面的 ,对应的节点就是靠上的节点),然后把当前节点add进去。 在拼的时候因为是要先add后面的,导致了数组越界,ArrayList的特点是 长度等于5了,才能add 6的。这就有了41,42,43,47这几步奇葩的操作,因为java刚入门,所以应该有更好的解决方案。