📌  相关文章
📜  来自中序和后序遍历的前序(1)

📅  最后修改于: 2023-12-03 15:26:34.516000             🧑  作者: Mango

来自中序和后序遍历的前序

在二叉树的遍历中,前序遍历、中序遍历和后序遍历是最基本和最重要的三种遍历方式。给定任意两种遍历方式,都可以唯一确定一棵二叉树。本文将重点介绍如何根据中序遍历和后序遍历构建出原二叉树的前序遍历。

构造原二叉树

在构造原二叉树之前,我们先了解如何用中序遍历和后序遍历重建二叉树。

假设给定一个二叉树的中序遍历和后序遍历序列,如下所示:

中序遍历序列:[D B E A F C]

后序遍历序列:[D E B F C A]

  1. 后序遍历序列的最后一个元素为根节点,即上面序列中A。
  2. 在中序遍历序列中,根节点左侧的所有元素构成根节点的左子树,右侧的所有元素构成根节点的右子树。所以上面序列中根节点左侧为[D B E],右侧为[F C]。
  3. 确定了根节点和左右子树之后,我们可以递归的构造出左右子树,这里递归的难点在于如何正确的确定每个子树在中序遍历序列和后序遍历序列中的范围,这里不做过多讲解。

重建出该二叉树如下所示:

       A
     /   \
    /     \
   B       C
  / \     /
 D   E   F
根据中序遍历和后序遍历构造前序遍历

根据前面的构造二叉树方法,我们可以采用递归的方式取得二叉树的前序遍历序列。具体实现如下:

class Solution:
    def buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode:
        if not inorder:
            return None
        root_val = postorder[-1]
        root = TreeNode(root_val)
        root_index = inorder.index(root_val)
        root.left = self.buildTree(inorder[:root_index], postorder[:root_index])
        root.right = self.buildTree(inorder[root_index + 1:], postorder[root_index:-1])
        return root

上述代码使用了python中的递归思想,具体实现如下:

  1. 如果传入的中序遍历序列空,则返回None。
  2. 后序遍历序列的最后一个元素为根节点,创建一个以这个根节点为值的节点。
  3. 在中序遍历序列中,根节点左侧的所有元素构成根节点的左子树,右侧的所有元素构成根节点的右子树,找到根节点在中序遍历序列中的索引,左侧的元素为左子树的中序遍历序列,右侧的元素为右子树的中序遍历序列。
  4. 确定好了左右子树的中序遍历序列后,根据后序遍历序列的特点,我们可以找到右子树的起始位置,即postorder[root_index:-1],左子树的起始位置为postorder[:root_index]。然后递归调用buildTree函数,构造左右子树。
  5. 最后返回以当前根节点为根的二叉树。

该算法的时间复杂度为$O(nlogn)$,空间复杂度为$O(n)$。