zoukankan      html  css  js  c++  java
  • 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

    import java.util.*;
    
    /*
    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;
    
        public TreeNode(int val) {
            this.val = val;
    
        }
    
    }
    */
    /*
        层序遍历,但是使用start、end来记录每层的节点数
        注意end值一直在更新,当每一层的结点值被取出时,end更新,更新之后为下一层的节点存储
        做准备。第一层1个,end = 1
    */
    
    public class Solution {
        ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
            ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
            if(pRoot == null){
                return result;
            }
            Queue<TreeNode> layer = new LinkedList<TreeNode>();
            ArrayList<Integer> layerList = new ArrayList<Integer>();
            layer.add(pRoot);
            int start = 0, end = 1;
            while(!layer.isEmpty()){
                TreeNode cur = layer.remove();
                layerList.add(cur.val);
                start++;
                if(cur.left!=null){
                    layer.add(cur.left);           
                }
                if(cur.right!=null){
                    layer.add(cur.right);
                }
                if(start == end){
                    end = layer.size();
                    start = 0;
                    result.add(layerList);
                    layerList = new ArrayList<Integer>();
                }
            }
            return result;
        }
    }

    以上是一种常规思路,要掌握。下面是一种递归方法。

    链接:https://www.nowcoder.com/questionTerminal/445c44d982d04483b04a54f298796288?f=discussion
    来源:牛客网
    
    public class Solution {
        ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
            ArrayList<ArrayList<Integer>> list = new ArrayList<>();
            depth(pRoot, 1, list);
            return list;
        }
         
        private void depth(TreeNode root, int depth, ArrayList<ArrayList<Integer>> list) {
            if(root == null) return;

          //当深度增加的时候,如果当前list中的ArrayList<Integer>>(存每层数)不够,则增加一个新的存,
          //如果够了,就接着存进最新的哪个ArrayList<Integer>>即可。比如第三层,四个数都存在第三个
          //ArrayList<Integer>>中

    if(depth > list.size())
                list.add(new ArrayList<Integer>());
            list.get(depth -1).add(root.val);
             
            depth(root.left, depth + 1, list);
            depth(root.right, depth + 1, list);
        }
    }

    使用list.get(depth-1)获取对应位置的存储ArrayList<Integer>,然后将本层的结点值存入。list下标从0开始。list.get(0)存第一层

  • 相关阅读:
    Liunx命令集
    Jenkins,tomcat和jdk安装步骤
    《九悦学车》和《忠金融·惠生活》BUG表
    2020年12月17日总结
    思维导图加上测试用例
    2020年12月15日总结
    双肩包、椅子和电梯的测试用例(测试题)
    fastadmin 前台关联搜索
    composer安装阿里云短信
    php 生成订单号
  • 原文地址:https://www.cnblogs.com/theWinter/p/11344448.html
Copyright © 2011-2022 走看看