从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
思路同上题 之字形打印二叉树一样
利用队列(先进先出) 储存如Array list 再存入总arraylist
public class Solution {
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
if(pRoot == null){
return res;
}
ArrayList<Integer> temp = new ArrayList<Integer>();//
Queue <TreeNode> q = new LinkedList<TreeNode>();//创建队列用来添加节点
q.offer(pRoot);//添加根节点
int start = 0, end = 1;
while(!q.isEmpty()){ //如果队列不为空, 继续循环 直到为空
TreeNode node = q.poll(); //添加queue第一个排出的元素,并删除
temp.add(node.val);
start++; //记录值+1
if(node.left != null){ //判断 是否有左子树, 如果有添加到queue
q.add(node.left);
}
if(node.right != null){//判断 是否有右子树, 如果有添加到queue
q.add(node.right);
}
if (start == end){ // 如果记录值到达queue的size reset
start = 0;
res.add(temp);
temp = new ArrayList<Integer>();// 并且将当前行存入Arraylist
end = q.size();
}
}
return res;
}
}
相关知识
queue的用法
offer,add 区别:
一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。
这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。
poll,remove 区别:
remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似, 但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。
peek,element区别:
element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。