给出一棵二叉树,返回其节点值从底向上的层次序遍历(按从叶节点所在层到根节点所在的层遍历,然后逐层从左往右遍历)
给出一棵二叉树 {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<List<Integer>> levelOrderBottom(TreeNode root) {// write your code hereif(root == null){return new ArrayList<List<Integer>>();}List<List<Integer>> ans = work(levelOrderBottom(root.left),levelOrderBottom(root.right));//递归List<Integer> rootval = new ArrayList<Integer>();rootval.add(root.val);ans.add(rootval);return ans;}public List<List<Integer>> work(List<List<Integer>> left,List<List<Integer>>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<List<Integer>> ans = new ArrayList<List<Integer>>();for(int i =0 ;i<len;i++){//java中array list 只可以add长度比size()大一或者以内的,如果add一个新的 老的会被后挤。所以有了6行后的remove,要是有更好的方法,欢迎赐教(本人java小白一个)ans.add(i,new ArrayList<Integer>());}while(count<=len){List<Integer> lv = left.size() == 0?new ArrayList<Integer>():left.remove(left.size()-1);List<Integer> rv = right.size() == 0?new ArrayList<Integer>():right.remove(right.size()-1);ans.remove(len-count);ans.add(len-count,miniwork(lv,rv));count++;}return ans;}public List<Integer> miniwork(List<Integer> left,List<Integer> right){//作用合并两个一维数组,右边的拼到左边if(left.size() == 0){return right;}if(right.size() == 0){return left;}int len = right.size();int count = 0;while(count<len){left.add(right.get(count));count++;}return left;} }
这个题网上的方法,就是正常的二叉树按层遍历然后 直接数组反转,或者入栈反转
如果这么做的话 和二叉树的层次正序遍历 就没区别了。出于这个想法 ,考虑出这种做法,可能略烦琐
递归的思想 左子树和右子树 都返回一个已经排序的二维数组。 我在当前节点把两个子数的返回数据拼在一起(这里要注意,因为子树的深度不一致,那么只能先拼数组后面的 ,对应的节点就是靠上的节点),然后把当前节点add进去。 在拼的时候因为是要先add后面的,导致了数组越界,ArrayList的特点是 长度等于5了,才能add 6的。这就有了41,42,43,47这几步奇葩的操作,因为java刚入门,所以应该有更好的解决方案。