📅  最后修改于: 2023-12-03 14:49:01.595000             🧑  作者: Mango
二叉树的逆时针螺旋遍历指的是按照从根节点开始,按照逆时针螺旋的方式遍历二叉树,将遍历结果以数组的形式返回。
我们可以用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
我们可以使用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)内完成二叉树的逆时针螺旋遍历。