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)存第一层

  • 相关阅读:
    Leetcode 16.25 LRU缓存 哈希表与双向链表的组合
    Leetcode437 路径总和 III 双递归与前缀和
    leetcode 0404 二叉树检查平衡性 DFS
    Leetcode 1219 黄金矿工 暴力回溯
    Leetcode1218 最长定差子序列 哈希表优化DP
    Leetcode 91 解码方法
    Leetcode 129 求根到叶子节点数字之和 DFS优化
    Leetcode 125 验证回文串 双指针
    Docker安装Mysql记录
    vmware虚拟机---Liunx配置静态IP
  • 原文地址:https://www.cnblogs.com/theWinter/p/11344448.html
Copyright © 2011-2022 走看看