链接:剑指offer 32
题目:不分行从上往下打印出二叉树的每个节点,同层节点从左至右打印。例如输入{8,6,10,#,#,2,1},如以下图中的示例二叉树,则依次打印8,6,10,2,1(空节点不打印,跳过),请你将打印的结果存放到一个数组里面,返回。
思路:
创建两个队列,一个nodes存储每一层的结点,另一个que存储树的key ;
使用循环从队列nodes中弹出一个结点:
- 获取当前结点的key放到que中;
- 如果当前结点的左子结点不为空,则把左子结点放入到队列nodes中
- 如果当前结点的右子结点不为空,则把右子结点放入到队列nodes中
注意队列是先进先出,尾插头取。也可以两个都用ArrayList,用ArrayList创建que时,弹出的时候使用nodes.remove(0)即弹出头结点。
代码:
public class Solution {
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
Queue<TreeNode> nodes=new LinkedList<>();
ArrayList<Integer> que=new ArrayList<>();
if(root==null){ // 安全校验
return que; //返回空的ArrayList
}
nodes.add(root); // 先放入头节点
while(!nodes.isEmpty()){
TreeNode n=nodes.poll(); //弹出nodes的头结点,即每一轮循环的当前结点n
que.add(n.val); //将弹出的结点的key放入que
if(n.left!=null){
nodes.add(n.left);
}
if(n.right!=null){
nodes.add(n.right);
}
}
return que;
}
}
注意:
这里用的
if(root!=null){ nodes.add(root); }
而不是
if(root==null){
return null; }
当root为null时 ,nodes也为null,就不满足while条件了, 从而不会因为进入循环导致报错。