返回

后序遍历二叉树:LeetCode 145

前端

二叉树后序遍历

二叉树的后序遍历是先访问左子树,再访问右子树,最后访问根节点。其递归算法如下:

def postorder_traversal_recursive(root):
    if root is None:
        return []
    return postorder_traversal_recursive(root.left) + postorder_traversal_recursive(root.right) + [root.val]

二叉树后序遍历(使用栈)

使用栈进行后序遍历的思路是,先将根节点入栈。然后,循环执行以下步骤,直到栈为空:

  • 出栈栈顶节点,将其放入结果列表。
  • 如果栈顶节点有右孩子,将右孩子入栈。
  • 如果栈顶节点有左孩子,将左孩子入栈。

代码如下:

def postorder_traversal_stack(root):
    if root is None:
        return []
    stack = [root]
    result = []
    while stack:
        node = stack.pop()
        result.append(node.val)
        if node.right:
            stack.append(node.right)
        if node.left:
            stack.append(node.left)
    return result

LeetCode 145

LeetCode 145 题要求我们实现二叉树的后序遍历。我们可以使用上述递归或栈的方法来解决。

使用递归的方法:

def postorderTraversal(self, root):
    if not root:
        return []
    left = self.postorderTraversal(root.left)
    right = self.postorderTraversal(root.right)
    return left + right + [root.val]

使用栈的方法:

def postorderTraversal(self, root):
    stack, result = [], []
    while stack or root:
        if root:
            stack.append(root)
            result.insert(0, root.val)
            root = root.right
        else:
            root = stack.pop()
            root = root.left
    return result

总结

本文介绍了两种实现二叉树后序遍历的方法:递归和栈。这两种方法在时间复杂度和空间复杂度上都是相同的,因此选择哪种方法取决于具体的实现细节和喜好。