利用二叉链表作为存储结构,已知二叉树的中序序列和前序序列,构造二叉树c++
时间: 2024-11-13 13:17:10 浏览: 3
基于二叉链表的二叉树最大宽度的计算.docx
在C++中,利用二叉链表构造二叉树给定中序遍历和前序遍历是一个常见的问题,可以使用递归的方式来解决。首先,我们需要两个辅助函数,一个用于查找节点,另一个用于创建新节点。
假设我们有一个`Node`结构体:
```cpp
struct Node {
int val;
Node* left;
Node* right;
Node(int x) : val(x), left(nullptr), right(nullptr) {}
};
```
下面是构造过程的主要步骤:
1. **中序遍历找到根节点**:由于前序遍历的第一个元素通常是根节点,所以我们在中序遍历中找第一个元素就是根节点。
- 遍历中序序列,当遇到的第一个值等于前序序列的第一个值时,就是根节点。
- 记录当前节点的位置。
2. **构建左子树和右子树**:
- 使用前序序列的剩余部分,通过中序序列来确定左右子树的范围。
- 对左子树,找到左子树的开始位置,然后使用前序序列和中序序列构建左子树。
- 对右子树,找到右子树的结束位置(加一),重复以上步骤。
3. **递归创建子树**:
- 如果左子树或右子树的范围不为空,对每个子树分别应用同样的过程。
这是一个简单的伪代码框架,你可以按照这个思路编写完整的C++代码:
```cpp
Node* buildTree(vector<int>& inorder, vector<int>& preorder) {
if (inorder.empty() || preorder.empty()) return nullptr;
// 找到根节点
int root_val = preorder[0];
auto root_pos = find(inorder.begin(), inorder.end(), root_val);
Node* root = new Node(root_val);
// 分别处理左右子树
if (root_pos != inorder.end()) {
// 左子树
int left_end = root_pos - 1; // 中序左侧的边界
root->left = buildTree(inorder.substr(0, left_end), preorder.substr(1, left_end - inorder.begin() + 1));
// 右子树
int right_start = root_pos + 1;
root->right = buildTree(inorder.substr(right_start), preorder.substr(left_end + 1));
}
return root;
}
// 辅助函数,找到元素在有序列表中的位置
size_t find(const std::vector<int>& vec, int target) {
// 省略具体的查找实现...
}
```
记得补充`find`函数的具体实现,并注意内存管理,如动态分配的节点需要手动删除。
阅读全文