📌  相关文章
📜  迭代后序遍历 |第 2 组(使用一叠)(1)

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

迭代后序遍历 | 第 2 组 (使用一叠)

在二叉树的遍历中,后序遍历就是遍历顺序为左子树-->右子树-->父节点。递归方法很容易实现,但是迭代方法却比较困难,本文将会介绍使用一叠迭代方法实现二叉树的后序遍历的方法。

算法思想

与前序遍历和中序遍历不同,后序遍历需要在访问完左右子树之后才能访问根节点。因此需要在遍历过程中记录已经遍历的右子树。具体方法是使用一个栈来存储节点,并且在出栈时检查当前节点的右子树是否已经遍历,如果已经遍历就访问当前节点,否则将右子树入栈。

代码实现
def postorderTraversal(root):
    stack = []
    last_visited = None
    result = []
    while root or stack:
        while root:
            stack.append(root)
            root = root.left

        node = stack[-1]
        if not node.right or node.right == last_visited:
            result.append(node.val)
            stack.pop()
            last_visited = node
        else:
            root = node.right

    return result
复杂度分析

由于每个节点最多入栈一次,出栈一次,所以时间复杂度为 $O(n)$。空间复杂度最差情况下为 $O(n)$,即树为一条链的情况下。