题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
分析
与二叉树的层序遍历那个题思想类似,但因为要分层所以也有所区别。
这里所使用的方法是:
(1)用LinkedList.remove()方法直接删除最先进来的结点,在打印到当前结点时删除这个结点,就可以保证本层全部打印之后,剩下的元素有且只有下一层的全部元素。
(2)用start记录本层打印了多少个,end记录下一层要打印多少个。当start==end本层打印完毕时,end=LinkedList.size(); start=0; layerList清空;再去打印下一层。
具体代码如下:
//最开始使用一个自定义特殊结点,在nodeList中作为一层结束的标志位。但是不好判断哪个list.right是当前层最后一个。。
//这里的方法是用start记录本层打印了多少个,end记录下一层要打印多少个
import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
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>();
//在while的循环里,直接layer.remove()的方法
//不能Queue<TreeNode> layer = new Queue<TreeNode>();这里Queue是一个接口,需要new它的实现类LinkedList
ArrayList<Integer> layerList = new ArrayList<Integer>();
layer.add(pRoot);
int start = 0, end = 1;//start记录本层打印了多少个,end记录下一层要打印多少个
while(!layer.isEmpty()){
TreeNode cur = layer.remove();
layerList.add(cur.val);//添加到本行打印的layerList里
start++;
//每打印一个节点,就把此节点的下一层的左右节点加入队列,并记录下一层要打印的个数
if(cur.left!=null){
layer.add(cur.left);
}
if(cur.right!=null){
layer.add(cur.right);
}
//本层打印完毕
if(start == end){
end = layer.size();
//这里与层序遍历题不同的是,queue在打印中会被删减,所以当打印完本层之后,就只剩下了下一层的所有元素。
start = 0;
result.add(layerList);
layerList = new ArrayList<Integer>(); //layerList以new的方式直接清空
}
}
return result;
}
}