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

  • 相关阅读:
    今天做了个小项目
    了解类与对象
    装机时键盘选择失误?教你修改kali Linux键盘到美式。
    一些模塊的用法
    你也是全员模块?
    金额保留2位小数 xx.00
    maven项目统一管理版本
    启动项目报错——找不到或无法加载主类 io.vertx.core.Launcher
    以jar包方式启动
    支付业务接口功能(二)
  • 原文地址:https://www.cnblogs.com/tobemaster/p/7796647.html
Copyright © 2011-2022 走看看