返回
揭秘二叉树构造的奥秘:从前序与中序遍历序列入手
后端
2024-01-19 17:50:44
在计算机科学的浩瀚宇宙中,二叉树是一颗璀璨的明珠。它以其简洁高效的结构,广泛应用于数据结构、算法和计算机图形学等领域。要构建一棵二叉树,最常见的途径之一就是利用前序和中序遍历序列。
前序遍历 ,顾名思义,就是从根节点开始,依次访问每个节点及其左子树和右子树。中序遍历 则不同,它从根节点的左子树开始,依次访问根节点和右子树。
如何从这两个遍历序列中重建二叉树呢?这是一个巧妙而优雅的过程,让我们一步步揭开它的奥秘。
第一步:找到根节点
前序遍历序列的第一个元素就是根节点。
第二步:划分中序遍历序列
中序遍历序列将根节点左边的元素划分为左子树,右边的元素划分为右子树。
第三步:递归构造子树
对左子树和右子树重复上述步骤,直到所有元素都被处理完。
举个例子
假设我们有前序遍历序列[1, 2, 4, 5, 3]和中序遍历序列[4, 2, 5, 1, 3]。
- 根节点是1,从前序遍历序列中获取。
- 中序遍历序列[4, 2, 5]是左子树,[1, 3]是右子树。
- 对于左子树,前序遍历序列为[2, 4, 5],中序遍历序列为[4, 2, 5]。重复上述步骤,得到左子树的根节点2。
- 对于右子树,前序遍历序列为[3],中序遍历序列为[1, 3]。重复上述步骤,得到右子树的根节点3。
通过递归应用这些步骤,我们最终可以构建出如下图所示的二叉树:
1
/ \
2 3
/ \
4 5
代码实现
def construct_tree(preorder, inorder):
if not preorder or not inorder:
return None
root = preorder[0]
root_index_in_inorder = inorder.index(root)
left_preorder = preorder[1:root_index_in_inorder + 1]
left_inorder = inorder[:root_index_in_inorder]
right_preorder = preorder[root_index_in_inorder + 1:]
right_inorder = inorder[root_index_in_inorder + 1:]
left_subtree = construct_tree(left_preorder, left_inorder)
right_subtree = construct_tree(right_preorder, right_inorder)
return TreeNode(root, left_subtree, right_subtree)
掌握了从前序和中序遍历序列构造二叉树的技巧,你将在数据结构和算法的道路上更进一步。它不仅是一项必备的技能,更是一扇通往更广阔计算机科学世界的门扉。