从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
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)存第一层