从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

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

原文地址:https://www.cnblogs.com/theWinter/p/11344448.html