用c++编写一个程序,在自定义函数中完成下列功能并在主函数进行测试: (1)根据测试数据画出二叉树,按照先序遍历写出读入字符的顺序,建立相应的二叉 链表。 (2)输出二叉树的先序遍历序列。 测试数据: 中序遍历序列:DGBAECF 后序遍历序列:GDBEFCA
时间: 2024-10-26 16:16:18 浏览: 25
在C++中,我们可以使用结构体来表示二叉树节点,并通过递归的方式实现先序遍历和构建二叉链表。这里是一个简单的示例:
```cpp
#include <iostream>
using namespace std;
// 定义二叉树节点结构
struct TreeNode {
char data;
TreeNode* left;
TreeNode* right;
TreeNode(char val): data(val), left(nullptr), right(nullptr) {}
};
// 先序遍历辅助函数,用于构建链表
TreeNode* preorderHelper(TreeNode* root, string inorder) {
if (root == nullptr || inorder.empty())
return nullptr;
// 在中序遍历中找到当前节点的位置
size_t index = inorder.find(root->data);
// 构建左子树
root->left = preorderHelper(root->left, inorder.substr(0, index));
// 调整剩余部分的索引
inorder = inorder.substr(index + 1);
// 构建右子树
root->right = preorderHelper(root->right, inorder);
return root;
}
// 主函数,用于测试和绘制二叉树
int main() {
string inorder = "DGBAEFC";
string postorder = "GDBEFCA";
// 根据后序遍历重构中序遍历
for (size_t i = 0; i < postorder.size(); ++i) {
string leftInOrder = inorder.substr(0, inorder.find(postorder[i]));
inorder = inorder.substr(inorder.find(postorder[i]) + 1);
inorder.insert(0, leftInOrder);
}
// 创建根节点
TreeNode* root = new TreeNode(postorder.back());
// 先序遍历构造二叉链表
root = preorderHelper(root, inorder);
// 输出先序遍历序列
cout << "先序遍历序列:";
printPreorder(root);
cout << endl;
// 清理内存
delete root;
return 0;
}
// 辅助函数,用于打印先序遍历序列
void printPreorder(TreeNode* node) {
if (node != nullptr) {
cout << node->data;
printPreorder(node->left);
printPreorder(node->right);
}
}
```
在这个程序中,我们首先通过后序遍历序列重建中序遍历,然后利用先序遍历的特点(根节点 -> 左子树 -> 右子树),递归地构建二叉链表。最后,我们在`main`函数中输出先序遍历序列。
阅读全文