前序遍历: A B D H I E C F J K G L M 中序遍历: H D I B E A F J K C G L M 根据前序和中序编写一段python代码构建出此二叉树
时间: 2025-06-27 13:17:11 浏览: 9
### 根据前序遍历和中序遍历来构造二叉树
给定一棵二叉树的**前序遍历**和**中序遍历**序列,我们可以唯一地重建这棵二叉树。下面我们将通过Python代码来实现这个过程。
#### 分析步骤:
1. **前序遍历的第一个元素**一定是当前子树的根节点。
2. 在**中序遍历**中找到该根节点的位置,可以将中序遍历划分为左子树和右子树两部分:
- 左边的部分对应于左子树;
- 右边的部分对应于右子树。
3. 然后再分别对左右子树递归处理,直到所有结点都被访问到为止。
根据您提供的两个序列:
- 前序遍历:`A B D H I E C F J K G L M`
- 中序遍历:`H D I B E A F J K C G L M`
我们发现根节点为 `A`, 接下来就可以按照上述规则进行拆分并递归建树了。
下面是具体的 Python 实现:
```python
# 定义二叉树节点结构体
class TreeNode:
def __init__(self, val=0):
self.val = val
self.left = None
self.right = None
def build_tree(preorder, inorder):
if not preorder or not inorder:
return None
# 创建根节点 (由前序遍历第一个值确定)
root_val = preorder[0]
root = TreeNode(root_val)
# 找到根节点在中序遍历中的位置
mid_index = inorder.index(root_val)
# 划分子数组,并递归创建左右子树
left_inorder = inorder[:mid_index] # 中序左边部分 -> 左子树
right_inorder = inorder[mid_index+1:] # 中序右边部分 -> 右子树
# 对应前序也划分成相应长度的小段
left_preorder = preorder[1:len(left_inorder)+1] # 跟随中序切片调整
right_preorder = preorder[len(left_inorder)+1:]
# 进行递归建树操作
root.left = build_tree(left_preorder, left_inorder)
root.right = build_tree(right_preorder, right_inorder)
return root
if __name__ == '__main__':
pre_order = ['A', 'B', 'D', 'H', 'I', 'E', 'C', 'F', 'J', 'K', 'G', 'L', 'M']
in_order = ['H', 'D', 'I', 'B', 'E', 'A', 'F', 'J', 'K', 'C', 'G', 'L', 'M']
tree_root = build_tree(pre_order, in_order)
```
上面程序会生成如下的二叉树结构:
```
A
/ \
B C
/ \ / \
D E F G
/ \ /|\ |
H I J K L
\
M
```
阅读全文
相关推荐


















