返回
算法巧思,剖析前序中序建二叉树
前端
2023-10-05 10:38:39
LeetCode 105:从前序与中序遍历序列构造二叉树
从纷繁复杂的算法世界中抽丝剥茧,我们踏上LeetCode 105题的征途——从前序与中序遍历序列构造二叉树。这是一道考查二叉树构建的经典难题,掌握其背后的算法精髓,不仅能提升我们的算法素养,更能为我们解决实际问题提供借鉴。
算法剖析:递归拆解的巧妙
破解本题的关键在于充分理解递归的思想。前序遍历序列中,第一个元素一定是根节点的值。而在中序遍历序列中,根节点将序列一分为二,左子树位于根节点的左侧,右子树位于根节点的右侧。
基于这一观察,我们可以采用递归的方式逐层构建二叉树。以根节点为起点,在中序遍历序列中找到根节点的位置,则该位置左侧的中序序列即为左子树的中序序列,右侧的中序序列即为右子树的中序序列。同理,在左右子树中分别找到根节点的前序遍历序列,即可递归构建左子树和右子树。
代码实现:简洁优雅的递归
掌握了算法原理,我们便可着手代码实现。Python的简洁特性为我们提供了绝佳的平台:
def buildTree(preorder, inorder):
if not preorder or not inorder:
return None
root_val = preorder[0]
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 = TreeNode(root_val)
root.left = buildTree(left_preorder, left_inorder)
root.right = buildTree(right_preorder, right_inorder)
return root
用例探究:验证算法的正确性
理论和代码缺一不可,通过用例验证,我们才能真正检验算法的正确性。以下是一组测试用例:
前序遍历序列 | 中序遍历序列 | 预期结果 |
---|---|---|
[3, 9, 20, 15, 7] | [9, 3, 15, 20, 7] | 二叉树:[3, 9, 20, null, null, 15, 7] |
[1, 2, 4, 5, 3, 6, 7] | [4, 2, 5, 1, 6, 3, 7] | 二叉树:[1, 2, 3, 4, 5, 6, 7] |
[1] | [1] | 二叉树:[1] |
通过用例验证,我们的算法成功构建出了正确的二叉树,印证了算法的有效性和准确性。
总结:算法之美,解题之道
LeetCode 105题的求解过程是一个算法学习的缩影。从算法原理的理解到代码的实现,再到用例的验证,每一环节都考验着我们的思维和动手能力。通过这道题的探索,我们不仅提升了算法素养,更领悟了算法之美和解题之道。
在算法的海洋中,还有无数的谜题等待着我们去破解。只要我们坚持不懈,勇于探索,算法之门终将为我们敞开,引领我们通往更广阔的知识彼岸。