📜  二叉树的逆时针螺旋遍历(1)

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

二叉树的逆时针螺旋遍历

二叉树的逆时针螺旋遍历指的是按照从根节点开始,按照逆时针螺旋的方式遍历二叉树,将遍历结果以数组的形式返回。

方法1:BFS + 栈

我们可以用BFS遍历二叉树,并用一个栈来记录每层顺序保存的顺序,并进行逆序操作得到逆时针螺旋遍历结果。

class Solution:
    def spiralOrder(self, root: TreeNode) -> List[int]:
        if not root:
            return []
        res, stack, is_reverse = [], [root], False
        while stack:
            level_res = []
            for i in range(len(stack)):
                node = stack.pop(0)
                level_res.append(node.val)
                if node.left:
                    stack.append(node.left)
                if node.right:
                    stack.append(node.right)
            if is_reverse:
                res += level_res[::-1]
            else:
                res += level_res
            is_reverse = not is_reverse
        return res
方法2:DFS + 前缀和

我们可以使用DFS遍历二叉树,并用前缀和的方式记录每层的节点,然后对奇数层逆序得到逆时针螺旋遍历结果。

class Solution:
    def spiralOrder(self, root: TreeNode) -> List[int]:
        if not root:
            return []
        depth, prefix_sum = 0, []
        self.dfs(root, depth, prefix_sum)
        res = []
        for i in range(len(prefix_sum)):
            if i % 2 == 0:
                res.extend(prefix_sum[i])
            else:
                res.extend(prefix_sum[i][::-1])
        return res

    def dfs(self, root, depth, prefix_sum):
        if not root:
            return
        if depth >= len(prefix_sum):
            prefix_sum.append([])
        prefix_sum[depth].append(root.val)
        self.dfs(root.left, depth + 1, prefix_sum)
        self.dfs(root.right, depth + 1, prefix_sum)

以上两种方法都可以在时间复杂度O(N)和空间复杂度O(N)内完成二叉树的逆时针螺旋遍历。