用C++根据二叉数的抽象数据类型的定义,使用二叉链表实现一个先序为ABCDEFG,中序为CBDAFEG的二叉树,程序实现以下基本功能:1 二叉树的建立 2 前序遍历二叉树 3 中序遍历二叉树 4后序遍历二叉树
时间: 2024-08-12 17:10:45 浏览: 51
根据二叉树的抽象数据类型的定义,使用二叉链表实现一个二叉树。
5星 · 资源好评率100%
在C++中,我们可以首先定义一个二叉树节点的抽象数据类型,然后使用二叉链表来实现这个二叉树。这里,我们假设每个节点包含一个字符和两个指向子节点的指针(左孩子和右孩子)。给定先序遍历为ABCDEFG,中序遍历为CBDAFEG,我们知道先序遍历的第一个元素是根节点,而中序遍历可以帮助我们重建树结构。
```cpp
#include <iostream>
using namespace std;
// 定义二叉树节点
class TreeNode {
public:
char data;
TreeNode* left, *right;
TreeNode(char ch) : data(ch), left(nullptr), right(nullptr) {}
};
// 用于比较字符以找到中序序列中的正确位置
int findInOrderIndex(TreeNode* root, char target) {
if (root == nullptr) return 0;
if (root->data == target) return 1;
int leftIndex = findInOrderIndex(root->left, target);
if (leftIndex != 0) return leftIndex + 1;
return findInOrderIndex(root->right, target);
}
// 用二叉链表实现二叉树的建立
TreeNode* buildTreeFromPreAndInOrder(string pre, string inOrder) {
int n = pre.size();
TreeNode* root = new TreeNode(pre);
int i = 1, j = findInOrderIndex(root, pre);
while (i < n) {
TreeNode* newNode = new TreeNode(pre[i]);
if (pre[i] < pre[j - 1]) {
// 根据中序遍历找到当前节点的位置
newNode->left = root->left;
root->left = newNode;
} else {
// 向右寻找插入位置
while (j < n && pre[j] > pre[i]) {
root = root->right;
j++;
}
// 插入到右子树
root->right = newNode;
}
i++;
}
return root;
}
// 前序、中序和后序遍历
void preorderTraversal(TreeNode* node) {
if (node == nullptr) return;
cout << node->data; // 前序
preorderTraversal(node->left);
preorderTraversal(node->right);
}
void inorderTraversal(TreeNode* node) {
if (node == nullptr) return;
inorderTraversal(node->left);
cout << node->data; // 中序
inorderTraversal(node->right);
}
void postorderTraversal(TreeNode* node) {
if (node == nullptr) return;
postorderTraversal(node->left);
postorderTraversal(node->right);
cout << node->data; // 后序
}
int main() {
string pre = "ABCDEFG";
string inOrder = "CBDAFEG";
// 建立二叉树
TreeNode* tree = buildTreeFromPreAndInOrder(pre, inOrder);
// 遍历并打印结果
cout << "前序遍历: ";
preorderTraversal(tree);
cout << endl;
cout << "中序遍历: ";
inorderTraversal(tree);
cout << endl;
cout << "后序遍历: ";
postorderTraversal(tree);
cout << endl;
return 0;
}
```
在这个程序中,`buildTreeFromPreAndInOrder` 函数用于根据先序和中序遍历来构建二叉树,`preorderTraversal`, `inorderTraversal`, 和 `postorderTraversal` 分别实现了三种遍历方式。运行`main`函数后,会输出构建好的二叉树的前序、中序和后序遍历结果。
阅读全文