把二叉树打印成多行
题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
思路
参考左程云的思路:
重点是设置last和nlast:
last指定当前行的最右节点
nlast代表下一行的最右节点
import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
/*
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) {
ArrayList<ArrayList<Integer> > res = new ArrayList<>();
if(pRoot == null){
return res;
}
Queue<TreeNode> q = new LinkedList<>();
q.offer(pRoot);
TreeNode last = pRoot;
TreeNode nlast = null;
ArrayList<Integer> list = new ArrayList<>();
while(!q.isEmpty()){
TreeNode p = q.poll();//出队列,就把他左右孩子入队列,
//同时下一层的最右要跟着更新
list.add(p.val);
if(p.left != null){
q.offer(p.left);
nlast = p.left;
}
if(p.right != null){
q.offer(p.right);
nlast = p.right;
}
//如果到了本层的最右,就把这一层结果放入。
//最后一层的结果要单独放入。
if(p == last && !q.isEmpty()){
res.add(new ArrayList<>(list));//注意此处的结果放入的形式是要新建一个arraylist,用list对其进行初始化
//res.add(list);这种方式是错误的!!!
last = nlast;
list.clear();
}
}
res.add(new ArrayList<>(list));
//res.add(list);
return res;
}
}