返回
洞悉树的精髓:从前序与中序遍历构建二叉树
前端
2024-02-19 12:10:53
前序与中序遍历:探寻树的结构
在二叉树的广袤天地里,前序遍历和中序遍历是两柄利器,它们能够帮助我们洞悉树的结构和节点的排列顺序。
-
前序遍历 :前序遍历遵循“根 - 左子树 - 右子树”的原则,它以根节点作为起点,依次遍历其左子树和右子树。这种遍历方式让我们对树的整体结构一目了然。
-
中序遍历 :中序遍历则遵循“左子树 - 根 - 右子树”的原则,它从根节点的左子树开始,然后访问根节点,最后遍历右子树。中序遍历的结果将为我们呈现出树中节点的有序排列。
构建二叉树:从遍历序列中还原树的结构
给定前序遍历和中序遍历序列,我们的目标是利用这些信息还原出完整的二叉树。这个过程可以归纳为以下步骤:
-
确定根节点 :前序遍历序列的第一个元素就是根节点的值。
-
划分左右子树 :在中序遍历序列中,根节点将序列划分为左右两个部分。根节点左侧的元素属于左子树,右侧的元素属于右子树。
-
递归构建子树 :对于根节点的左子树和右子树,我们可以分别应用上述步骤进行递归构建。
代码实现:将算法付诸实践
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题向我们展示了算法解决问题的能力。通过前序遍历和中序遍历序列,我们能够还原出完整的二叉树结构。这不仅体现了算法的严谨性,也彰显了算法在解决实际问题中的应用价值。