返回

洞悉树的精髓:从前序与中序遍历构建二叉树

前端

前序与中序遍历:探寻树的结构

在二叉树的广袤天地里,前序遍历和中序遍历是两柄利器,它们能够帮助我们洞悉树的结构和节点的排列顺序。

  • 前序遍历 :前序遍历遵循“根 - 左子树 - 右子树”的原则,它以根节点作为起点,依次遍历其左子树和右子树。这种遍历方式让我们对树的整体结构一目了然。

  • 中序遍历 :中序遍历则遵循“左子树 - 根 - 右子树”的原则,它从根节点的左子树开始,然后访问根节点,最后遍历右子树。中序遍历的结果将为我们呈现出树中节点的有序排列。

构建二叉树:从遍历序列中还原树的结构

给定前序遍历和中序遍历序列,我们的目标是利用这些信息还原出完整的二叉树。这个过程可以归纳为以下步骤:

  1. 确定根节点 :前序遍历序列的第一个元素就是根节点的值。

  2. 划分左右子树 :在中序遍历序列中,根节点将序列划分为左右两个部分。根节点左侧的元素属于左子树,右侧的元素属于右子树。

  3. 递归构建子树 :对于根节点的左子树和右子树,我们可以分别应用上述步骤进行递归构建。

代码实现:将算法付诸实践

def buildTree(preorder, inorder):
    if not preorder or not inorder:
        return None

    # 确定根节点
    root_val = preorder[0]
    root = TreeNode(root_val)

    # 划分左右子树
    root_index = inorder.index(root_val)
    left_inorder = inorder[:root_index]
    right_inorder = inorder[root_index+1:]

    # 递归构建子树
    left_preorder = preorder[1:len(left_inorder)+1]
    right_preorder = preorder[len(left_inorder)+1:]
    root.left = buildTree(left_preorder, left_inorder)
    root.right = buildTree(right_preorder, right_inorder)

    return root

算法分析:揭示效率与时空复杂度

  • 时间复杂度 :该算法的时间复杂度为 O(n),其中 n 是树的节点数。这是因为算法需要遍历整个前序遍历序列和中序遍历序列。

  • 空间复杂度 :该算法的空间复杂度为 O(n),这是因为算法需要在递归过程中存储当前正在构建的子树。

结语:算法之美,在于解决问题的智慧

Leetcode-105题向我们展示了算法解决问题的能力。通过前序遍历和中序遍历序列,我们能够还原出完整的二叉树结构。这不仅体现了算法的严谨性,也彰显了算法在解决实际问题中的应用价值。