• 二叉树的层次遍历 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刚入门,所以应该有更好的解决方案。

  • 相关阅读:
    springmvcIntercept(拦截器)
    springmvc多文件上传
    websphere8 从安装到部署 测试集群应用程序 安装j2ee程序(非常详细)
    WebSphere集群环境修改IHS端口号的方法
    WAS缓存问题
    websphere部署中文乱码问题
    WAS8.5安装和部署
    MQ7.5以后的权限问题解决
    IBM websphere MQ远程队列的简单配置
    MQ--API总结
  • 原文地址:https://www.cnblogs.com/tobemaster/p/7796647.html
Copyright © 2020-2023  润新知