题目描述:
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
例如:
给定二叉树: [3,9,20,null,null,15,7],3
/ \
9 20
/ \
15 7
返回:[3,9,20,15,7]
提示:
节点总数 <= 1000
参考解题思路:光度优先,利用队列存放二叉树的节点,当队列为空时跳出while循环,每次取出队列的头元素,判断该元素的左右子节点是否为空,不为空则追加进队列
- 特例处理: 当树的根节点为空,则直接返回空列表 [] ;
- 初始化: 打印结果列表 res = [] ,包含根节点的队列 queue = [root] ;
- BFS 循环: 当队列 queue 为空时跳出;
- 出队: 队首元素出队,记为 node;
- 打印: 将 node.val 添加至列表 tmp 尾部;
- 添加子节点: 若 node 的左(右)子节点不为空,则将左(右)子节点加入队列 queue ;
- 返回值: 返回打印结果列表 res 即可。
public int[] levelOrder(TreeNode root) {
// root为空判断
if (root == null) {
return new int[]{};
}
List<Integer> list = new ArrayList<>(); // 定义存放节点集合
Queue<TreeNode> queue = new LinkedList<>(); // 定义存放节点队列
queue.offer(root); // 加入初始根节点
while (!queue.isEmpty()) { // 队列不为空则进入while循环
TreeNode node = queue.poll(); // 取出队列头节点元素
list.add(node.val); // 节点追击进集合
// 该节点左右子节点是否为空--不为空则追加进队列元素中
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
// 节点集合转为数组
int[] array = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
array[i] = list.get(i);
}
return array;
}
复杂度分析:
时间复杂度 O(N): N为二叉树的节点数量,即 BFS 需循环 N 次。
空间复杂度 O(N): 最差情况下,即当树为平衡二叉树时,最多有N/2 个树节点同时在 queue 中,使用O(N)大小的额外空间。
作者:jyd
链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof/solution/mian-shi-ti-32-i-cong-shang-dao-xia-da-yin-er-ch-4/