📜  逐行逐级遍历|第 3 组(使用一个队列)(1)

📅  最后修改于: 2023-12-03 15:28:22.493000             🧑  作者: Mango

逐行逐级遍历-第 3 组(使用一个队列)

简介

在二叉树的遍历算法中,逐行逐级遍历算法是一种非常常见的算法,它可以按层次遍历整棵二叉树的所有节点。本文介绍第三组逐行逐级遍历算法,使用了一个队列的数据结构,这种算法常用于 BFS(宽度优先搜索)和图形算法中。该算法具有时间和空间复杂度为 O(N) 的特点,其中 N 为二叉树节点的数量。

实现思路
  1. 定义一个队列 Q,将二叉树的根节点压入队列。
  2. 对于每个节点,将左子节点和右子节点压入队列 Q 中。
  3. 不断重复步骤 2,直到队列 Q 为空。在这个过程中,每一次都将队首节点从队列中取出,并输出该节点值。
  4. 重复步骤 2 和步骤 3,直到二叉树中的所有节点都被访问为止。
代码实现
class Node:
    def __init__(self, val=None, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def levelorder(root):
    '''
    :param root: 二叉树根节点
    '''
    if not root:
        return []
    res = []  # 存放结果的列表
    queue = [root] # 定义队列,存放访问过的节点
    while queue:
        level = []  # 存放每一层节点值的列表
        n = len(queue)  # 每一层节点的数量
        for i in range(n):
            node = queue.pop(0)  # 取出队首节点
            level.append(node.val)  # 将节点值加入该层列表中
            if node.left:  # 将节点的左子节点加入队列中
                queue.append(node.left)
            if node.right:  # 将节点的右子节点加入队列中
                queue.append(node.right)
        res.append(level)  # 将该层节点值列表加入结果中
    return res

以上是 Python 语言的代码实现,代码中 Node 类用于构建二叉树节点,levelorder 函数用于实现逐行逐级遍历,输入参数为二叉树的根节点,输出结果为一个二维列表,列表中每个子列表表示每层节点值。

总结

逐行逐级遍历算法是二叉树遍历的一种重要算法,该算法利用队列的先进先出特点实现按层次逐一遍历所有节点的目的。此算法实现简单,只需要一个队列的额外空间,适用于数据量较小的情况。若数据量较大,则会浪费过多的空间,运行效率降低。以下是该算法的时间和空间复杂度总结:

  • 时间复杂度 O(N):每个节点入队和出队各一次。
  • 空间复杂度 O(N):队列最大长度不超过 N。