二叉树的层次遍历 II

给出一棵二叉树,返回其节点值从底向上的层次序遍历(按从叶节点所在层到根节点所在的层遍历,然后逐层从左往右遍历)

样例

给出一棵二叉树 {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 here
        if(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刚入门,所以应该有更好的解决方案。

posted @ 2017-11-07 02:57  萝卜er  阅读(766)  评论(0编辑  收藏  举报