用c++依据二叉树的先序序列和中序序列 构造以b为根的二叉树的功能,其中输出二叉树以括号表示法和凹入表表示法描 ##
时间: 2024-11-09 18:02:12 浏览: 39
在C++中,根据二叉树的先序遍历(Preorder Traversal)和中序遍历(Inorder Traversal)重建一棵二叉树是一项常见的任务。这两个序列分别包含了树节点的顺序信息:
- 先序遍历:根节点 -> 左子树 -> 右子树
- 中序遍历:左子树 -> 根节点 -> 右子树
这里是一个基本的算法步骤:
1. **找到根节点**:由于先序遍历的第一个元素总是根节点,你可以通过比较先序和中序序列的首个元素确定根节点。
2. **从中序遍历找左右子树**:先序遍历剩余部分的首元素将是根节点右子树的开始位置,在中序序列中找到对应的位置,然后这个范围就是左子树的中序遍历序列。
3. **递归构建子树**:对找到的左子树和右子树分别应用同样的过程,直到遍历完所有的节点。
下面是一个简单的示例代码(假设你已经有了两个`vector<int>`类型的序列`preorder`(先序遍历)和`inorder`(中序遍历),并且它们的长度相同):
```cpp
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if (preorder.empty() || inorder.empty()) return nullptr;
// 找到根节点
TreeNode* root = new TreeNode(preorder[0]);
// 中序索引
int index = find(inorder.begin(), inorder.end(), preorder[0]);
// 划分子树
vector<int> left_inorder(inorder.begin(), inorder.begin() + index);
vector<int> right_inorder(index + 1, inorder.end());
// 递归构建左右子树
root->left = buildTree(left_inorder, preorder);
root->right = buildTree(right_inorder, preorder);
return root;
}
// 辅助函数,查找元素在有序数组中的位置
size_t find(const vector<int>& arr, const int& target) {
auto it = lower_bound(arr.begin(), arr.end(), target);
return it == arr.end() ? arr.size() : distance(arr.begin(), it);
}
```
构建完成后,你可以使用中序遍历或层次遍历的方式来打印出二叉树的括号表示法或凹入表示法。
阅读全文