📅  最后修改于: 2023-12-03 14:49:44.030000             🧑  作者: Mango
在二叉树的后序遍历中,我们需要先遍历左子树,再遍历右子树,最后访问根节点。这个问题的难点在于我们需要在 O(1) 的额外空间下完成遍历。
我们可以使用 Morris 遍历来解决这个问题。
Morris 遍历是一种基于线索二叉树的遍历方式,可以实现 O(1) 空间的遍历。我们通过建立线索二叉树,在遍历的过程中记录前驱节点,以避免使用递归或者栈。
通过 Morris 遍历的方法,我们可以得到每个节点的访问顺序,并将它们加入答案数组中。最终,我们会得到一个后序遍历的数组。以下是用 Python 实现 Morris 遍历的后序遍历的代码:
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return []
cur = dummy = TreeNode(-1, None, root)
res = []
while cur:
if cur.left is None:
cur = cur.right
else:
predecessor = cur.left
while predecessor.right and predecessor.right != cur:
predecessor = predecessor.right
if predecessor.right is None:
predecessor.right = cur
cur = cur.left
else:
predecessor.right = None
res += self.traceBack(cur.left, predecessor)
cur = cur.right
return res + self.traceBack(dummy.left, cur)
def traceBack(self, fromNode: TreeNode, toNode: TreeNode) -> List[int]:
res = []
cur = fromNode
while cur != toNode:
res.append(cur.val)
cur = cur.right
res.append(toNode.val)
res.reverse()
return res
Morris 遍历是一种非常巧妙的二叉树遍历方式,能够实现 O(1) 空间复杂度,它的核心在于构建一个线索化二叉树,通过线索化处理,实现遍历过程中的回溯。算法虽然简单,但并不容易理解,需要对二叉树的结构和指针的操作非常熟悉才能够掌握。