层序遍历
层序遍历(Level Order Traversal)是一种用于遍历树或图的算法,它按照层次顺序逐层访问节点。层序遍历通常使用队列(Queue)来实现,确保每一层的节点按顺序被访问。
层序遍历的核心思想
-
按层次访问:
- 从根节点开始,逐层访问节点。
- 先访问第一层的节点,然后是第二层,依此类推。
-
使用队列:
- 将当前层的节点加入队列。
- 从队列中取出节点,访问它,并将其子节点加入队列。
- 重复上述过程,直到队列为空。
层序遍历的步骤
-
初始化:
- 将根节点加入队列。
-
遍历队列:
- 从队列中取出一个节点,访问它。
- 将该节点的子节点(如果有)加入队列。
-
重复直到队列为空:
- 继续上述过程,直到队列为空,表示所有节点都已访问。
层序遍历的实现
以下是层序遍历的Python实现(以二叉树为例):
from collections import deque
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def level_order_traversal(root):
if not root:
return []
result = [] # 存储遍历结果
queue = deque([root]) # 使用队列存储待访问的节点
while queue:
level_size = len(queue) # 当前层的节点数
current_level = [] # 存储当前层的节点值
for _ in range(level_size):
node = queue.popleft() # 取出队列中的第一个节点
current_level.append(node.val) # 访问当前节点
# 将当前节点的子节点加入队列
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
result.append(current_level) # 将当前层的节点值加入结果
return result
# 示例调用
# 构建一个二叉树
# 1
# / \
# 2 3
# / \ \
# 4 5 6
root = TreeNode(1)
root.left = TreeNode(2, TreeNode(4), TreeNode(5))
root.right = TreeNode(3, None, TreeNode(6))
# 层序遍历
print(level_order_traversal(root))
代码解释
-
TreeNode类:
- 定义二叉树的节点结构,包含值
val
、左子节点left
和右子节点right
。
- 定义二叉树的节点结构,包含值
-
level_order_traversal函数:
- 如果根节点为空,返回空列表。
- 使用队列
deque
存储待访问的节点。 - 遍历队列,每次处理一层的节点:
- 记录当前层的节点值。
- 将当前节点的子节点加入队列。
- 将当前层的节点值加入结果列表
result
。
-
示例调用:
- 构建一个二叉树,并调用
level_order_traversal
函数进行层序遍历。
- 构建一个二叉树,并调用
输出结果
对于示例二叉树:
- queue = [1], pop(1), current_level = [1]
- queue = [2, 3], pop(2)
- queue = [3, 4, 5], pop(3)
- queue = [4, 5, 6], current_level = [2, 3], pop(4)
- queue = [5, 6], pop(5)
- queue = [6], pop(6),
- queue = [], current_level = [4, 5, 6]
层序遍历的输出为:
[[1], [2, 3], [4, 5, 6]]
层序遍历的应用
-
二叉树的序列化与反序列化:
- 层序遍历可以用于将二叉树序列化为字符串,或将字符串反序列化为二叉树。
-
寻找二叉树的最大深度:
- 通过层序遍历,可以逐层计算二叉树的深度。
-
寻找二叉树的最小深度:
- 通过层序遍历,可以在遇到第一个叶子节点时返回当前深度。
-
二叉树的锯齿形遍历:
- 在层序遍历的基础上,交替改变遍历方向(从左到右或从右到左)。
总结
- 层序遍历是一种按层次访问树或图节点的算法。
- 使用队列可以高效地实现层序遍历。
- 层序遍历的时间复杂度为 \(O(n)\) ,其中 \(n\) 是节点的数量。
- 层序遍历广泛应用于树和图的遍历、序列化、深度计算等问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类