📜  逐行层序遍历|设置 2(使用两个队列)(1)

📅  最后修改于: 2023-12-03 14:58:01.540000             🧑  作者: Mango

逐行层序遍历 | 设置 2(使用两个队列)

逐行层序遍历是一种广度优先搜索算法的变种,它用于遍历树或图的节点。这种遍历方式将树或图的节点按照层级顺序进行访问,从根节点开始,依次访问每一层的节点,直到遍历完所有节点。

在这个介绍中,我们将学习逐行层序遍历算法的另一种实现方式,即 "设置 2" 算法。这种算法使用两个队列来记录当前层和下一层的节点,在遍历过程中交替使用这两个队列,以达到逐行输出的效果。

算法思路

下面是设置 2 算法的具体步骤:

  1. 初始化两个队列,currentLevelnextLevel,并将根节点入队到 currentLevel

  2. 循环直到队列为空:

    • currentLevel 中出队一个节点,并访问该节点。
    • 将该节点的左子节点和右子节点(如果存在)入队到 nextLevel
    • 如果 currentLevel 队列为空,则交换 currentLevelnextLevel,以进入下一层。
  3. 重复步骤 2,直到遍历完所有节点。

代码实现

下面是使用 Python 语言实现逐行层序遍历的设置 2 算法的示例代码:

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def levelOrder(root: TreeNode) -> List[List[int]]:
    if not root:
        return []

    result = []
    current_level = [root]

    while current_level:
        next_level = []
        current_level_values = []

        for node in current_level:
            current_level_values.append(node.val)

            if node.left:
                next_level.append(node.left)
            if node.right:
                next_level.append(node.right)

        result.append(current_level_values)
        current_level = next_level

    return result
示例

假设我们有下面这棵二叉树:

    3
   / \
  9   20
     /  \
    15   7

通过调用 levelOrder 函数,我们可以得到以下的逐行层序遍历结果:

root = TreeNode(3)
root.left = TreeNode(9)
root.right = TreeNode(20)
root.right.left = TreeNode(15)
root.right.right = TreeNode(7)

print(levelOrder(root))  # Output: [[3], [9, 20], [15, 7]]
总结

逐行层序遍历是一种非常有用的算法,特别适用于需要逐行输出树节点值的场景。通过设置 2 算法,我们可以使用两个队列来实现逐行遍历效果。这种算法的时间复杂度是 O(n),其中 n 是树的节点数量。