返回

一文读懂前序和中序遍历还原二叉树的奥秘

前端

前言

二叉树是一种重要的数据结构,广泛应用于计算机科学的各个领域。为了表示一棵二叉树,通常使用前序遍历和中序遍历。前序遍历遵循根结点-左子树-右子树的顺序,而中序遍历则遵循左子树-根结点-右子树的顺序。

从遍历序列构建二叉树

给定前序遍历和中序遍历序列,我们的目标是重建出原始的二叉树。这可以通过递归算法来实现。

递归算法

递归算法的核心思想是将问题分解成更小的子问题。对于二叉树的构建,我们可以将问题分解为以下步骤:

  1. 在前序遍历序列中,第一个元素必定是根结点。
  2. 在中序遍历序列中,根结点将序列分割成左右两部分,分别对应左子树和右子树。
  3. 对于左子树,递归地应用相同的算法,使用前序遍历序列的第二个元素到左子树中根结点的元素,以及中序遍历序列中左子树的部分。
  4. 对于右子树,递归地应用相同的算法,使用前序遍历序列中左子树根结点之后的元素,以及中序遍历序列中右子树的部分。

代码示例

def construct_tree(preorder, inorder):
    # 递归基线条件:遍历序列为空
    if not preorder or not inorder:
        return None

    # 获取根结点
    root = preorder[0]

    # 在中序遍历序列中找到根结点的索引,将序列分割为左右子树
    root_index = inorder.index(root)

    # 递归构建左子树
    left_subtree = construct_tree(preorder[1:root_index+1], inorder[:root_index])

    # 递归构建右子树
    right_subtree = construct_tree(preorder[root_index+1:], inorder[root_index+1:])

    # 返回构建好的二叉树
    return TreeNode(root, left_subtree, right_subtree)

实例演示

假设前序遍历序列为 [3,9,20,15,7],中序遍历序列为 [9,3,15,20,7]。根据递归算法,我们可以逐步构建二叉树:

  1. 前序遍历序列的第一个元素 3 为根结点。
  2. 在中序遍历序列中,3 将序列分割为 [9] 和 [15,20,7],分别对应左子树和右子树。
  3. 左子树的前序遍历序列为 [9],中序遍历序列为 [9]。根据递归基线条件,左子树仅有一个根结点 9。
  4. 右子树的前序遍历序列为 [20,15,7],中序遍历序列为 [15,20,7]。重复步骤 3,递归构建右子树。
  5. 将构建好的左子树和右子树与根结点 3 组合,得到最终的二叉树。

总结

本文深入探讨了利用前序和中序遍历序列重建二叉树的算法。通过递归地分解问题,我们可以高效地构建出一棵完整的二叉树。这种算法在二叉树的构建和操作中具有广泛的应用,是计算机科学领域不可或缺的技术。