返回

以最简单的方式理解后序遍历与中序遍历:破解 LeetCode 106

前端

目录

  1. 后序遍历与中序遍历简介
  2. 从后序遍历和中序遍历构建二叉树
    • 寻找根节点
    • 递归构建子树
  3. Python 代码实现
    • 时间复杂度与空间复杂度分析
  4. 结语

后序遍历与中序遍历简介

后序遍历是指以如下顺序访问二叉树的节点:左子树、右子树、根节点。中序遍历是指以如下顺序访问二叉树的节点:左子树、根节点、右子树。

从后序遍历和中序遍历构建二叉树

我们从后序遍历序列的最后一个元素开始,作为二叉树的根节点。然后,我们在中序遍历序列中找到根节点,并将中序遍历序列划分为两部分:左子树的中序遍历序列和右子树的中序遍历序列。最后,我们分别使用后序遍历序列和划分的左子树、右子树的中序遍历序列递归地构建二叉树的左子树和右子树。

寻找根节点

后序遍历序列的最后一个元素是二叉树的根节点。

递归构建子树

  1. 在中序遍历序列中找到根节点。
  2. 将中序遍历序列划分为两部分:左子树的中序遍历序列和右子树的中序遍历序列。
  3. 使用后序遍历序列和划分的左子树、右子树的中序遍历序列递归地构建二叉树的左子树和右子树。

Python 代码实现

def build_tree(inorder, postorder):
    """
    从后序遍历和中序遍历序列构建二叉树。

    :param inorder: 中序遍历序列
    :param postorder: 后序遍历序列
    :return: 二叉树的根节点
    """

    # 递归终止条件:后序遍历序列为空
    if not postorder:
        return None

    # 后序遍历序列的最后一个元素是二叉树的根节点
    root = TreeNode(postorder[-1])

    # 在中序遍历序列中找到根节点
    index = inorder.index(root.val)

    # 将中序遍历序列划分为两部分:左子树的中序遍历序列和右子树的中序遍历序列
    left_inorder = inorder[:index]
    right_inorder = inorder[index + 1:]

    # 将后序遍历序列划分为两部分:左子树的后序遍历序列和右子树的后序遍历序列
    left_postorder = postorder[:index]
    right_postorder = postorder[index:-1]

    # 使用后序遍历序列和划分的左子树、右子树的中序遍历序列递归地构建二叉树的左子树和右子树
    root.left = build_tree(left_inorder, left_postorder)
    root.right = build_tree(right_inorder, right_postorder)

    # 返回二叉树的根节点
    return root

时间复杂度与空间复杂度分析

  • 时间复杂度:O(n^2),其中 n 为二叉树的节点数。
  • 空间复杂度:O(n),其中 n 为二叉树的节点数。

结语

本文通过清晰的讲解和直观的示例,为大家介绍了如何从后序遍历和中序遍历序列构建二叉树。我们希望这篇文章对您的学习有所帮助。如果您有任何疑问,欢迎在评论区留言。