问题描述
一棵圣诞树记作根节点为 root
的二叉树,节点值为该位置装饰彩灯的颜色编号。请按照从 左到右 的顺序返回每一层彩灯编号。
示例
示例 1:
输入:
root = [8,17,21,18,null,null,6]
输出:
[8,17,21,18,6]
解释:
上述二叉树结构如下:
8
/ \
17 21
/ \
18 6
按照从左到右的层序遍历,依次访问节点 8
、17
、21
、18
和 6
,因此输出为 [8,17,21,18,6]
。
提示
- 节点总数
<= 1000
- 节点值为整数,可能重复
思路解析
本题要求对二叉树进行 层序遍历(也称广度优先搜索,BFS),并按照从左到右的顺序返回每一层的节点值。层序遍历是二叉树遍历中常见的一种方式,适用于按层次处理树结构的数据。
核心思路
-
使用队列进行层序遍历:
- 初始化一个队列,将根节点入队。
- 当队列不为空时,记录当前队列的大小,表示当前层的节点数。
- 遍历当前层的所有节点,依次出队,并将其子节点(左子节点和右子节点)按顺序入队。
- 将当前层的节点值记录下来,作为结果的一部分。
-
边界情况处理:
- 如果树为空(
root
为None
),则返回空列表[]
。
- 如果树为空(
具体步骤
-
初始化:
- 创建一个空的结果列表
result
用于存储每一层的节点值。 - 使用一个队列
queue
来辅助层序遍历,初始时将根节点入队。
- 创建一个空的结果列表
-
层序遍历:
- 当队列不为空时,执行以下操作:
- 记录当前队列的长度
level_size
,表示当前层的节点数。 - 创建一个空的列表
current_level
来存储当前层的节点值。 - 遍历
level_size
次:- 从队列中出队一个节点
node
。 - 将
node.val
添加到current_level
。 - 如果
node.left
不为空,将其左子节点入队。 - 如果
node.right
不为空,将其右子节点入队。
- 从队列中出队一个节点
- 将
current_level
添加到result
。
- 记录当前队列的长度
- 当队列不为空时,执行以下操作:
-
返回结果:
- 遍历完成后,返回
result
。
- 遍历完成后,返回
复杂度分析
- 时间复杂度:O(n),其中
n
是二叉树的节点数。每个节点仅被访问一次。 - 空间复杂度:O(n),队列在最坏情况下需要存储一整层的节点,空间复杂度与节点数线性相关。
代码实现
Python 实现
# Definition for a binary tree node.
from typing import Optional, List
from collections import deque
class TreeNode:
def __init__(self, val: int =0, left: Optional['TreeNode']=None, right: Optional['TreeNode']=None):
self.val = val
self.left = left
self.right = right
class Solution:
def levelOrder(self, root: Optional[TreeNode]) -> List[int]:
if not root:
return []
result = []
queue = deque([root])
while queue:
level_size = len<