import java.util.*;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
if(pRoot == null){
return new ArrayList<ArrayList<Integer> >();
}
ArrayList<ArrayList<Integer> > res = new ArrayList<ArrayList<Integer> >();
int now = 1;
int next = 0;
LinkedList<TreeNode> nodeList = new LinkedList<TreeNode>();
ArrayList<Integer> tmp = new ArrayList<Integer>();
nodeList.add(pRoot);
while(!nodeList.isEmpty()){
TreeNode n = nodeList.removeFirst();
now--;
tmp.add(n.val);
if(n.left!=null){
nodeList.add(n.left);next++;
}
if(n.right!=null){
nodeList.add(n.right);next++;
}
if(now == 0){
res.add(new ArrayList<Integer>(tmp));
tmp.clear();
now = next;
next = 0;
}
}
return res;
}
}
广度优先,用linkedlist存节点,每次弹出都把子节点加进去
- now记录当前层还剩多少个节点,每次弹出-1,并记录val
- next记录下一层加了多少,每次加子节点时+1
- 如果now=0,则说明当前层已经打印完毕,把记录val值的list加入结果res,注意要清空记录每一层val的list,因为每一层都要用。
- 打印完一行后,要开始打印下一行,则now=next,next=0
- 因为java非基础变量都是引用传递,所以加入到res时要新生成对象,否则存进去的数据会在以后被改动
res.add(new ArrayList<Integer>(tmp));