📅  最后修改于: 2023-12-03 14:49:49.256000             🧑  作者: Mango
在二叉树的后序遍历中,我们先访问左子树,再访问右子树,最后访问根节点。使用递归的方式很容易实现后序遍历,但是递归会使用O(N)的系统栈空间,不符合要求。
我们可以使用迭代的方式来实现后序遍历,并且只使用O(1)的额外空间。具体的实现可以借助栈来辅助完成。
以下是用于实现O(1)空间复杂度后序遍历的代码片段:
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def postorderTraversal(root):
if not root:
return []
result = []
stack = []
prev = None
while root or stack:
while root:
stack.append(root)
root = root.left
root = stack[-1]
# 检查右子树是否已经访问过,或者右子树为空
if not root.right or root.right == prev:
node = stack.pop()
result.append(node.val)
prev = node
root = None
else:
root = root.right
return result
此代码使用了迭代和栈来实现后序遍历。核心思想是从根节点开始,先对左子树进行深度遍历,并将遍历过程中经过的节点加入栈中。当树的左子树遍历完成后,再从栈中弹出节点并判断其右子树是否已经被访问过或为空,如果是则将该节点加入结果列表中,否则将右子树入栈并继续迭代。
这种方法的时间复杂度为O(N),空间复杂度为O(1),符合要求。
希望以上介绍对您有帮助!