返回
二叉树构建:从前序与中序遍历序列中构建二叉树
闲谈
2023-10-23 06:18:18
### **一、前序遍历与中序遍历简介**
- 前序遍历(pre-order traversal):
- 根结点 -> 左子树 -> 右子树
- 优点:简单高效,易于理解和实现
- 缺点:不方便从序列中唯一确定一棵树
- 中序遍历(in-order traversal):
- 左子树 -> 根结点 -> 右子树
- 优点:易于生成一棵二叉搜索树(BST)
- 缺点:查找特定结点效率不高
### **二、从前序与中序遍历序列构造二叉树**
- **思路:**
- 确定根结点:前序遍历序列的第一个结点即是根结点。
- 确定左子树与右子树:利用中序遍历序列将结点分为左右两部分,左部分是左子树,右部分是右子树。
- 递归处理:对左右子树重复上述步骤。
- **算法:**
- 确定根结点:前序遍历序列的第一个结点即是根结点。
- 确定左子树与右子树:利用中序遍历序列将结点分为左右两部分,左部分是左子树,右部分是右子树。
- 递归处理:对左右子树重复上述步骤。
- **复杂度分析:**
- 时间复杂度:O(n^2),其中n为序列的长度。这是因为在最坏情况下,我们需要对每个结点进行n次比较。
- 空间复杂度:O(n),其中n为序列的长度。这是因为我们在递归过程中需要使用栈来存储结点。
### **三、代码实现:**
```python
def build_tree(preorder, inorder):
"""
从前序与中序遍历序列构造二叉树。
参数:
preorder:前序遍历序列
inorder:中序遍历序列
返回:
根结点
"""
if not preorder or not inorder:
return None
# 确定根结点
root = TreeNode(preorder[0])
# 确定左子树与右子树
index = inorder.index(root.val)
left_inorder = inorder[:index]
right_inorder = inorder[index + 1:]
left_preorder = preorder[1:index + 1]
right_preorder = preorder[index + 1:]
# 递归处理
root.left = build_tree(left_preorder, left_inorder)
root.right = build_tree(right_preorder, right_inorder)
return root
# 测试代码
preorder = [3, 9, 20, 15, 7]
inorder = [9, 3, 15, 20, 7]
root = build_tree(preorder, inorder)
print(root)
```
### **四、总结**
本文介绍了如何从前序与中序遍历序列构造二叉树。我们给出了一个清晰且简单的递归算法,帮助你轻松理解这一过程。无论你是初学者还是经验丰富的程序员,都能从本文中有所收获。