难度中等
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
例如:
给定二叉树:[3,9,20,null,null,15,7]
,3 / \ 9 20 / \ 15 7返回:
[3,9,20,15,7]
思路:
- 题目要求的二叉树的 从上至下 打印(即按层打印),又称为二叉树的 广度优先搜索(BFS)。
- BFS 通常借助 队列 的先入先出特性来实现。
题解 :
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int[] levelOrder(TreeNode root) {
//特例处理: 当树的根节点为空,则直接返回空列表 [] ;
if(root==null) return new int[0];
//初始化队列,new Queue<>(){{add(root);}};匿名方法
Queue<TreeNode> queue=new LinkedList<>(){{add(root);}};
ArrayList<Integer> arr=new ArrayList<>();
//BFS循环,当队列为空时跳出循环
while(!queue.isEmpty()){
//1.队首出队
TreeNode node=queue.poll();
//2.将node.val添加至列表arr尾部
arr.add(node.val);
//3.若node左(右)节点不为空,则加入队列
if(node.left!=null) queue.add(node.left);
if(node.right!=null) queue.add(node.right);
}
//返回打印结果列表
int [] res=new int[arr.size()];
for(int i=0;i<arr.size();i++){
res[i]=arr.get(i);
}
return res;
}
}
知识拓展
Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。
queue LinkedList的实现,offer()底层是调用 add()方法的。 而poll 和remove的区别在于,判断取到的节点是不是null,remove判断是null的话,会抛出NPE异常
add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
offer 添加一个元素并返回true 如果队列已满,则返回false
poll 移除并返问队列头部的元素 如果队列为空,则返回null
element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
peek 返回队列头部的元素 如果队列为空,则返回null
put 添加一个元素 如果队列满,则阻塞
take 移除并返回队列头部的元素 如果队列为空,则阻塞
返回的是对象数组,是为了将里面的Int自动打包成Integer
ps:用作个人打卡复习,不喜勿喷 。