- 广度优先搜素
- 队列
题目描述
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
例如:
给定二叉树: [3,9,20,null,null,15,7],
返回:[3,9,20,15,7]
解题思路
使用队列,出队一个元素就把此元素的左右节点加入队列中,最后输出队列元素。
- 题目要求的二叉树的 从上至下 打印(即按层打印),又称为二叉树的 广度优先搜索(BFS)。
- BFS 通常借助 队列 的先入先出特性来实现。
算法流程:
- 特例处理: 当树的根节点为空,则直接返回空列表 [] ;
- 初始化: 打印结果列表 res = [] ,包含根节点的队列 queue = [root] ;
- BFS 循环: 当队列 queue 为空时跳出;
- 出队: 队首元素出队,记为 node;
- 打印: 将 node.val 添加至列表 tmp 尾部;
- 添加子节点: 若 node 的左(右)子节点不为空,则将左(右)子节点加入队列 queue ;
- 返回值: 返回打印结果列表 res 即可。
代码
class Solution {
public int[] levelOrder(TreeNode root) {
if(root == null) return new int[0];
Queue<TreeNode> queue = new LinkedList<>(){{ add(root); }};
ArrayList<Integer> ans = new ArrayList<>(); //定义数组列表,用来存储每次出队的队首元素;并确定整数数组的所占空间大小
while(!queue.isEmpty()){
TreeNode head = queue.poll(); //poll:数据出队,队空返回null;remove:数据出队,队空报错
ans.add(head.val);
if(head.left != null) queue.add(head.left);
if(head.right != null) queue.add(head.right);
}
int[] res = new int[ans.size()];//静态数组必须要定义数组大小,所以需要ans来确定空间大小
for(int i = 0; i < ans.size(); i++){
res[i] = ans.get(i);
}
return res;
}
}
复杂度分析
- 时间复杂度 O(N) : N 为二叉树的节点数量,即 BFS 需循环 N 次。
- 空间复杂度 O(N) : 最差情况下,即当树为平衡二叉树时,最多有 N/2 个树节点同时在 queue 中,使用 O(N) 大小的额外空间。
知识点
1.队列
1.定义队列,并赋值root
Queue<TreeNode> queue = new LinkedList<>(){{ add(root); }};//队列元素为TreeNode类型
2.向队列中添加队列元素head.left
queue.add(head.left);
3.删除队列元素,并将删除的元素存储给head
TreeNode head = queue.poll(); // poll:数据出队,队空返回null;
TreeNode head = queue.remove(); // remove:数据出队,队空报错
2. 数组列表ArrayList
1.创建
ArrayList<Integer> ans = new ArrayList<>();
2.获取元素data,并赋给res
res = ans.get(data);
3.添加元素data
ans.add(data);
4.获取数组列表大小
ans.size()
3.整数数组
1.创建整数数组
int[] res = new int[size];//静态数组必须要定义数组大小size
2.返回空数组
return new int[0];