- 题目:
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
2. 二叉树的层次遍历,做之前,我们先来回顾一下二叉树的层次遍历。代码如下,思路很简单,我们建一个队列,先放第一行的结点,即根结点,然后放它的左右结点,再依次放左右结点的左右结点。再往队列里放的同时,我们依次进行pop()队列操作,保证我们的操作顺序。(文字表达可能有所欠缺,建议直接看代码)
import java.util.LinkedList;
class test2 {
public static void levelOrder(TreeNode root){
LinkedList<TreeNode> queue=new LinkedList<>();
queue.add(root);
while(queue!=null){
TreeNode ret=queue.pop();
System.out.println(ret.val);
if(root.left!=null) queue.add(root.left);
if(root.right!=null) queue.add(root.right);
}
}
}
- 那么本题的思路呢,我们需要在层次遍历的基础上,再队列里添加行分隔符,帮助我们判断这一行结束了没。队列里的情况大概是这样的:null,1,null,2,3,null,4,5,6,7null…(第一行1,第二行2,3;第三行4,5,6,7)值得注意的是,先有分隔符null,后有结点。nul后面表示的是下一行的几个结点,队列各元素依次出队,当未到分隔符时,我们把这一行元素的各左右结点加入队列,到达分隔符时,就代表这一行元素的各左右结点已经都添加到队列里来了,我们就将这些左右结点输出,并添加一个分隔符,因为这就是一行完了。然后不断循环,言语表达不到处,见代码。
- 代码:
class Solution {
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer> > ret=new ArrayList<>();
if(pRoot==null) return ret;
ArrayList<Integer> list=new ArrayList<>();
LinkedList<TreeNode> queue=new LinkedList<>();
queue.add(null);//层数分隔符
queue.add(pRoot);
while(queue.size()!=1){
TreeNode node=queue.pop();//或者pop()方法也可以
if(node==null){//到达层分隔符
Iterator<TreeNode> iter=null;
iter=queue.iterator();//从前往后遍历
while(iter.hasNext()){
TreeNode temp=(TreeNode)iter.next();
list.add(temp.val);
}
ret.add(new ArrayList<Integer>(list));
list.clear();
queue.addLast(null);//插入分割符
continue;//这个continue很关键
}
if(node.left!=null) queue.add(node.left);
if(node.right!=null) queue.add(node.right);
}
return ret;
}
}
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}