📜  每两个级别后发生方向更改的级别顺序遍历|递归方法(1)

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

每两个级别后发生方向更改的级别顺序遍历 | 递归方法

在树的遍历中,有一个比较特殊的情况,就是每两层的遍历方向会发生改变。这种情况下,我们可以使用递归方法进行遍历。

实现思路

对于这种情况,我们可以先从根节点开始,从左到右遍历第一层,在遍历第二层之前,将当前层遍历的节点存放在一个列表里(或者栈里)。当遍历到第二层时,我们就从列表的最后一个节点开始遍历,即从右到左遍历第二层的节点。

接下来,我们进入第三层时,再次按照从左到右的顺序遍历,并将第三层的节点加入到列表中。在遍历第四层之前,我们需要按照从右到左的顺序遍历列表中的节点,即按照从下到上的顺序遍历第二层的节点(因为第二层的节点是按照从右到左的顺序遍历的)。

依次类推,每两层的顺序都是相反的。

代码实现

下面是使用 Python 实现的代码:

def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
    if not root:
        return []
    queue = [root]
    res = []
    level = 1
    while queue:
        size = len(queue)
        level_queue = []
        for i in range(size):
            node = queue.pop(0)
            level_queue.append(node.val)
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
        if level % 2 == 0:
            res.append(level_queue[::-1])
        else:
            res.append(level_queue)
        level += 1
    return res

我们首先判断根节点是否为空,如果不为空,就将根节点加入到队列中。接着我们定义一个变量 level,用来表示当前遍历的层数,初始值为 1。

在循环中,我们首先获取当前层的节点数 size,然后创建一个列表 level_queue,用来存放当前层的节点值。

接着,我们使用一个 for 循环,从队列中获取当前层的节点,并将其值加入到 level_queue 中。同时,我们还需要将当前节点的左右子节点加入到队列中。

在 for 循环结束后,我们判断当前层数 level 是否为偶数,如果是,就将 level_queue 反转后加入到 res 中,否则,直接将 level_queue 加入到 res 中。

最后,我们将 level 加 1,开始下一层的遍历。

总结

以上就是使用递归方法实现每两个级别后发生方向更改的级别顺序遍历的方法。虽然实现方法有一些复杂,但是只要理解了实现思路,就能够轻松地理解和使用。