使用C++编写一个程序,在自定义函数中完成下列功能并在主函数进行测试: (1) 根据测试数据画出二叉树, 按照先序遍历写出读入字符的顺序, 建立相应的二叉链表。3 (2) 输出二叉树的后序遍历序列。 测试数据: 先序遍历序列: ABDGCEF 中序遍历序列: DGBAECF
时间: 2024-10-25 08:14:27 浏览: 55
在C++中,我们可以使用结构体表示二叉树节点,并结合链表来构建先序和后序遍历。首先,我们创建一个二叉树节点结构:
```cpp
#include <iostream>
using namespace std;
// 定义二叉树节点
struct TreeNode {
char val;
TreeNode* left;
TreeNode* right;
TreeNode(char v) : val(v), left(nullptr), right(nullptr) {}
};
// 先序遍历函数
void preOrder(TreeNode* root, string& result) {
if (root == nullptr)
return;
result += root->val; // 将当前节点值添加到结果
preOrder(root->left, result); // 遍历左子树
preOrder(root->right, result); // 遍历右子树
}
// 后序遍历函数
void postOrder(TreeNode* root, string& result) {
if (root == nullptr)
return;
postOrder(root->left, result);
postOrder(root->right, result);
result += root->val; // 最后将当前节点值添加到结果
}
int main() {
// 测试数据
string preorder = "ABDGCEF";
string inorder = "DGBAECF";
// 构建二叉树
TreeNode* root = buildTree(preorder.c_str(), inorder.c_str());
// 打印先序遍历结果
cout << "Preorder traversal: ";
string preorderResult;
preOrder(root, preorderResult);
cout << preorderResult << endl;
// 打印后序遍历结果
cout << "Postorder traversal: ";
string postorderResult;
postOrder(root, postorderResult);
cout << postorderResult << endl;
// 清理并返回根节点
delete root;
return 0;
}
// 辅助函数:根据中序和前序遍历重建二叉树
TreeNode* buildTree(const char* preorder, const char* inorder) {
if (*preorder == '\0')
return nullptr;
TreeNode* root = new TreeNode(*preorder);
int inIndex = find(inorder, *preorder);
root->left = buildTree(preorder + 1, inorder);
root->right = buildTree(preorder + inIndex + 1, inorder + inIndex + 1);
return root;
}
// 查找字符在字符串中的索引
int find(const char* str, char ch) {
while (*str != '\0') {
if (*str == ch)
return str - inorder;
str++;
}
return -1; // 如果未找到,则返回-1
}
```
这个程序首先通过中序和先序遍历构建二叉树,然后分别进行先序和后序遍历并打印结果。注意,`buildTree`函数是一个辅助函数,用于根据给定的预序和中序遍历构造二叉树。
阅读全文