返回

LeetCode 103:二叉树的锯齿形层序遍历**

前端

锯齿形遍历的艺术

想象一下一棵二叉树,就像一棵真正的树,树枝向四面八方伸展。传统层序遍历按层探索这棵树,从上到下,一层一层地。然而,锯齿形层序遍历更具趣味性,它像微风轻轻摇曳树叶,从左到右遍历每一层,然后从右到左遍历下一层,依此类推。

算法的魔法

解决这个问题的诀窍在于使用广度优先搜索(BFS),这是一种遍历树形数据结构的有效方法。我们使用队列来存储每一层的节点,然后逐层处理它们。为了实现锯齿形遍历,我们交替使用栈来临时反转节点顺序。

具体步骤如下:

  1. 将根节点放入队列中。
  2. 循环执行以下步骤,直到队列为空:
    • 从队列中取出所有节点并存储在栈中。
    • 从栈中弹出节点并访问它们。
    • 将访问过的节点的子节点放入队列中。
    • 如果当前层是奇数层,则从左到右遍历节点;否则从右到左遍历节点。

示例代码

def zigzagLevelOrder(root):
    if not root:
        return []

    queue = [root]
    result = []
    level = 0

    while queue:
        level_size = len(queue)
        level_values = []

        for i in range(level_size):
            node = queue.pop(0)
            level_values.append(node.val)

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

        if level % 2 == 1:
            level_values.reverse()

        result.append(level_values)
        level += 1

    return result

结语

通过这篇文章,我们深入了解了锯齿形层序遍历的算法,并使用 BFS 和栈提供了清晰的解决方案。无论你是初学者还是经验丰富的程序员,希望这篇文章能够激发你的兴趣,帮助你解决更复杂的算法问题。记住,算法的魅力在于其优雅和效率,它们可以帮助我们以更智能、更有效的方式解决现实世界的问题。