编写一个程序,在自定义函数中完成下列功能并在主函数进行测试: (1)根据测试数据画出二叉树,按照先序遍历写出读入字符的顺序,建立相应的二叉链表。 (2)输出二叉树的后序遍历序列。 测试数据: 先序遍历序列:ABDGCEF 中序遍历序列:DGBAECF
时间: 2024-11-29 15:33:27 浏览: 16
西南交通大学-数据结构实验报告-求二叉树某结点在先序、中序、后序遍历中的访问次序
为了编写这个程序,我们可以使用C++语言,并利用递归的方式来构造二叉树。首先,我们需要定义一个二叉树节点结构,包括一个字符数据和两个指向左右子节点的指针。接下来,我们将编写两个函数:先序遍历和后序遍历的创建及遍历函数。
```cpp
#include <iostream>
using namespace std;
// 二叉树节点结构
struct TreeNode {
char data;
TreeNode* left;
TreeNode* right;
};
// 创建二叉树的先序遍历函数
TreeNode* createTreePreorder(string preorder) {
if (preorder.empty())
return nullptr;
TreeNode* root = new TreeNode(preorder[0]);
int index = 1;
while (index < preorder.size()) {
if (preorder[index] == 'L') { // 标识左孩子
root->left = createTreePreorder(preorder.substr(index + 1));
index += 1 + (root->left ? 1 : 0); // 跳过当前左孩子的标记和数据
} else if (preorder[index] == 'R') { // 标识右孩子
root->right = createTreePreorder(preorder.substr(index + 1));
index += 1 + (root->right ? 1 : 0); // 跳过当前右孩子的标记和数据
} else { // 非空节点,直接跳过
index++;
}
}
return root;
}
// 先序遍历输出函数
void printPreorder(TreeNode* node) {
if (node) {
cout << node->data;
printPreorder(node->left);
printPreorder(node->right);
}
}
// 后序遍历输出函数
void printPostorder(TreeNode* node) {
if (node) {
printPostorder(node->left);
printPostorder(node->right);
cout << node->data;
}
}
int main() {
string preorder = "ABDGCEF";
string inorder = "DGBAECF";
// 从先序遍历生成二叉树
TreeNode* root = createTreePreorder(preorder);
// 输出先序遍历
cout << "先序遍历序列: ";
printPreorder(root);
cout << endl;
// 输出后序遍历
cout << "后序遍历序列: ";
printPostorder(root);
cout << endl;
// 清理内存
deleteTree(root); // 自定义删除二叉树的函数
return 0;
}
// 删除二叉树的辅助函数,这里假设二叉树无重复元素
void deleteTree(TreeNode* node) {
if (!node)
return;
deleteTree(node->left);
deleteTree(node->right);
delete node;
}
```
在这个程序中,我们首先根据给定的先序遍历序列创建二叉树,然后分别输出先序遍历和后序遍历序列。注意,这个示例假设中序遍历序列是用来校验二叉树是否正确构建的,实际应用中并不需要单独提供。
阅读全文