层序遍历

层序遍历(Level Order Traversal)是一种用于遍历树或图的算法,它按照层次顺序逐层访问节点。层序遍历通常使用队列(Queue)来实现,确保每一层的节点按顺序被访问。


层序遍历的核心思想

  1. 按层次访问

    • 从根节点开始,逐层访问节点。
    • 先访问第一层的节点,然后是第二层,依此类推。
  2. 使用队列

    • 将当前层的节点加入队列。
    • 从队列中取出节点,访问它,并将其子节点加入队列。
    • 重复上述过程,直到队列为空。

层序遍历的步骤

  1. 初始化

    • 将根节点加入队列。
  2. 遍历队列

    • 从队列中取出一个节点,访问它。
    • 将该节点的子节点(如果有)加入队列。
  3. 重复直到队列为空

    • 继续上述过程,直到队列为空,表示所有节点都已访问。

层序遍历的实现

以下是层序遍历的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))

代码解释

  1. TreeNode类

    • 定义二叉树的节点结构,包含值 val、左子节点 left 和右子节点 right
  2. level_order_traversal函数

    • 如果根节点为空,返回空列表。
    • 使用队列 deque 存储待访问的节点。
    • 遍历队列,每次处理一层的节点:
      • 记录当前层的节点值。
      • 将当前节点的子节点加入队列。
    • 将当前层的节点值加入结果列表 result
  3. 示例调用

    • 构建一个二叉树,并调用 level_order_traversal 函数进行层序遍历。

输出结果

对于示例二叉树:

img

  1. queue = [1], pop(1), current_level = [1]
  2. queue = [2, 3], pop(2)
  3. queue = [3, 4, 5], pop(3)
  4. queue = [4, 5, 6], current_level = [2, 3], pop(4)
  5. queue = [5, 6], pop(5)
  6. queue = [6], pop(6),
  7. queue = [], current_level = [4, 5, 6]

层序遍历的输出为:

[[1], [2, 3], [4, 5, 6]]

层序遍历的应用

  1. 二叉树的序列化与反序列化

    • 层序遍历可以用于将二叉树序列化为字符串,或将字符串反序列化为二叉树。
  2. 寻找二叉树的最大深度

    • 通过层序遍历,可以逐层计算二叉树的深度。
  3. 寻找二叉树的最小深度

    • 通过层序遍历,可以在遇到第一个叶子节点时返回当前深度。
  4. 二叉树的锯齿形遍历

    • 在层序遍历的基础上,交替改变遍历方向(从左到右或从右到左)。

总结

  • 层序遍历是一种按层次访问树或图节点的算法。
  • 使用队列可以高效地实现层序遍历。
  • 层序遍历的时间复杂度为 \(O(n)\) ,其中 \(n\) 是节点的数量。
  • 层序遍历广泛应用于树和图的遍历、序列化、深度计算等问题。
posted @   codersgl  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示