编写一个程序,在自定义函数中完成下列功能并在主函数进行测试: (1)根据测试数据画出二叉树,按照先序遍历写出读入字符的顺序,建立相应的二叉链表。 (2)输出二叉树的后序遍历序列。测试数据: 先序遍历序列:ABDGCEF中序遍历序列:DGBAECF使用C++
时间: 2024-10-25 07:14:11 浏览: 40
西南交通大学-数据结构实验报告-求二叉树某结点在先序、中序、后序遍历中的访问次序
在C++中,我们可以创建一个自定义的数据结构`TreeNode`表示二叉树节点,并实现先序和后序遍历的功能。以下是简单的示例代码:
```cpp
#include <iostream>
#include <string>
// 定义二叉树节点
struct TreeNode {
char data;
TreeNode* left;
TreeNode* right;
TreeNode(char val) : data(val), left(nullptr), right(nullptr) {}
};
// 先序遍历 (根->左->右)
void preOrder(TreeNode* root, std::string& result) {
if (!root) return;
result += root->data;
preOrder(root->left, result);
preOrder(root->right, result);
}
// 后序遍历 (左->右->根)
void postOrder(TreeNode* root, std::string& result) {
if (!root) return;
postOrder(root->left, result);
postOrder(root->right, result);
result += root->data;
}
// 主函数,构建并遍历二叉树
int main() {
// 测试数据
std::string preorder = "ABDGCEF";
std::string inorder = "DGBAECF";
// 根据中序遍历重建二叉树
TreeNode* root = buildTree(inorder.c_str());
// 先序遍历并打印结果
std::string preResult;
preOrder(root, preResult);
std::cout << "先序遍历: " << preResult << "\n";
// 输出后序遍历序列
std::string postResult;
postOrder(root, postResult);
std::cout << "后序遍历: " << postResult << "\n";
// 清理二叉树
deleteTree(root);
return 0;
}
// 辅助函数,根据中序遍历重建二叉树
TreeNode* buildTree(const char* inorder) {
if (*inorder == '\0') return nullptr;
TreeNode* root = new TreeNode(*inorder);
int index = 0;
for (const char* ptr = inorder + strlen(inorder); *ptr != '\0'; --ptr) {
if (*ptr > root->data) break; // 找到根节点的结束位置
root->right = buildTree(ptr + 1);
}
if (index < strlen(inorder)) {
root->left = buildTree(inorder + index + 1);
}
return root;
}
// 删除整个二叉树辅助函数
void deleteTree(TreeNode*& node) {
if (node) {
deleteTree(node->left);
deleteTree(node->right);
delete node;
node = nullptr;
}
}
```
在这个例子中,我们首先通过中序遍历重建了二叉树,然后分别进行了先序和后序遍历,并打印了结果。
阅读全文