题目
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
例如:
给定二叉树: [3,9,20,null,null,15,7],
返回:
[3,9,20,15,7]
题解思路
二叉树的 从上至下 打印(即按层打印),又称为二叉树的 广度优先搜索(BFS)。
BFS 通常借助队列 的先入先出特性来实现。
算法流程:
特例处理
当树的根节点为空,则直接返回空列表 [] ;
初始化
打印结果列表 res = [] ,包含根节点的队列 queue = [root] ;
BFS 循环: 当队列 queue 为空时跳出;
出队: 队首元素出队,记为 node;
打印: 将 node.val 添加至列表list 尾部;
添加子节点: 若 node 的左(右)子节点不为空,则将左(右)子节点加入队列 queue ;
返回值
返回打印结果列表 res 即可
代码
class Solution {
public int[] levelOrder(TreeNode root) {
//根节点为空的情况返回空数
if(root==null)
return new int[0];
//生成一个队列,用来保存节点
//LinkedList底层双向链表,适合增删
Queue<TreeNode> queue=new LinkedList<>();
//生成一个 list,用来保存输出的节点
//ArrayList底层数组,适合查找
List<Integer> list=new ArrayList<>();
//首先让根节点入队
queue.add(root);
//遍历队列,直到队列为空
while (!queue.isEmpty()) {
//获取队列的头部元素
TreeNode node=queue.poll();
//把结点值存放到list中
list.add(node.val);
//判断该节点是否有左右子节点
//如果左子节点有值,则把左子节点加入到队列中
if(node.left!=null){
queue.add(node.left);
}
//如果右子节点有值,则把右子节点加入到队列中
if (node.right!=null){
queue.add(node.right);
}
}
//根据题目要求,把list转化为数组
int[] res=new int[list.size()];
for(int i=0;i< list.size();i++){
res[i]=list.get(i);
}
return res;
}
}