利用c++实现以下代码并输出测试代码设一棵二叉树以二叉链表表示, a) 实现由先序、中序序列构造二叉树的算法 b) 实现由后序、中序序列构造二叉树的算法
时间: 2024-11-20 07:36:21 浏览: 8
二叉树操作合集 相关文章:https://blog.csdn.net/weixin_42708321/article/deta
5星 · 资源好评率100%
首先,我们来分别实现由先序、中序和后序遍历来构建二叉树的算法。二叉链表可以表示为结构体TreeNode,包含一个整数值`val`和两个指向左右子节点的指针`left`和`right`。
**一、先序遍历(根-左-右)**
```cpp
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
// 先序遍历构造二叉树
TreeNode* buildTreeFromPreIn(const vector<int>& preOrder, const vector<int>& inOrder) {
if (preOrder.empty() || inOrder.empty()) return nullptr;
int rootVal = preOrder[0];
auto root = new TreeNode(rootVal);
// 在中序遍历中找到根节点的位置
int rootIndex = searchInOrder(inOrder, rootVal);
// 分别在先序和中序列表中删除已经找到的根节点
preOrder.erase(preOrder.begin());
inOrder.erase(inOrder.begin() + rootIndex);
// 递归构建左子树和右子树
root->left = buildTreeFromPreIn(preOrder, inOrder);
root->right = buildTreeFromPreIn({}, inOrder);
return root;
}
// 查找给定值在有序数组中的索引
size_t searchInOrder(vector<int>& arr, int target) {
for (size_t i = 0; i < arr.size(); ++i) {
if (arr[i] == target) return i;
}
return arr.size();
}
```
**二、后序遍历(左-右-根)**
```cpp
// 后序遍历构造二叉树
TreeNode* buildTreeFromPostIn(const vector<int>& postOrder, const vector<int>& inOrder) {
if (postOrder.empty() || inOrder.empty()) return nullptr;
// 使用栈辅助查找根节点
stack<int> s;
for (auto& val : inOrder) {
s.push(val);
if (s.top() == postOrder.back()) {
auto root = new TreeNode(postOrder.pop_back());
while (!s.empty() && s.top() != inOrder[s.size()-1]) {
root->left = new TreeNode(s.top());
s.pop();
}
if (!s.empty()) root->right = new TreeNode(s.top());
s.pop();
break;
}
}
// 递归构建剩余部分
root->left = buildTreeFromPostIn(postOrder, inOrder);
root->right = buildTreeFromPostIn(postOrder, {});
return root;
}
```
测试代码:
```cpp
int main() {
vector<int> preOrder = {1, 2, 4, 5, 3};
vector<int> inOrder = {4, 2, 5, 1, 3};
auto tree = buildTreeFromPreIn(preOrder, inOrder);
// 测试先序遍历
cout << "Preorder traversal: ";
helperTraversal(tree, "Preorder"); // 自定义遍历函数
vector<int> postOrder = {4, 5, 2, 3, 1};
tree = buildTreeFromPostIn(postOrder, inOrder);
// 测试后序遍历
cout << "\nPostorder traversal: ";
helperTraversal(tree, "Postorder");
return 0;
}
```
其中`helperTraversal`是一个通用的遍历函数,用于展示构建后的二叉树结构。你可以添加这个函数来完成完整的测试。
请注意,这些代码假设输入的序列是有效的二叉树构建顺序,实际上在实际应用中,为了保证正确性,你还需要检查输入的有效性。
阅读全文