📜  每两层后方向改变的层序遍历(1)

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

每两层后方向改变的层序遍历

层序遍历是二叉树遍历中的一种,它是按照从上到下、从左到右的顺序遍历节点的方法。每两层后方向改变的层序遍历是指:只在每两层后改变遍历方向,即从左到右遍历两层,然后从右到左遍历两层,如此往复。这种遍历方法可以在某些特定场合下起到更好的效果。

实现方法

假设我们需要遍历的二叉树是一棵完全二叉树,并且根节点位于第0层。我们可以使用一个队列来存储需要遍历的节点。在每次遍历的时候,我们从队列中出队一个节点,并将其左右子节点入队。当队列中的节点数等于某一层的总节点数时,说明已经遍历完了这一层,并需要转向下一层。此时我们用一个新的队列来存储下一层的节点,并用一个布尔变量reverse来表示当前遍历的方向,初始值为false

在遍历过程中,每遍历两层后,我们将reverse取反,并将下一层的队列中的节点按相反的顺序入队。具体实现如下:

from typing import List
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 zigzagLevelOrder(root: TreeNode) -> List[List[int]]:
    if not root:
        return []

    res = []
    q = deque([root])
    reverse = False

    while q:
        level_list = []
        level_size = len(q)
        for _ in range(level_size):
            node = q.popleft()
            level_list.append(node.val)
            if node.left:
                q.append(node.left)
            if node.right:
                q.append(node.right)

        if reverse:
            res.append(level_list[::-1])
        else:
            res.append(level_list)

        if len(q) == level_size * 2:
            reverse = not reverse

    return res
测试样例

我们可以用以下代码来测试上述方法:

root = TreeNode(3)
node1 = TreeNode(9)
node2 = TreeNode(20)
node3 = TreeNode(15)
node4 = TreeNode(7)
root.left = node1
root.right = node2
node2.left = node3
node2.right = node4

print(zigzagLevelOrder(root))  # [[3], [20, 9], [15, 7]]

上述示例中,我们使用了的二叉树的结构如下所示:

   3
  / \
 9  20
    / \
   15  7
总结

每两层后方向改变的层序遍历可以用一个队列来实现,具体方法为:用一个布尔变量来表示遍历的方向,每遍历两层后将该变量取反,并将下一层的节点按相反的顺序加入队列中。在实现过程中,我们需要注意一些细节,如何处理空树、空节点等情况。