题目: 根据二叉排序树的抽象数类型定义,使用链表实现一个二叉排序树。二叉排序树的基本功能: 1、建立 2、查找 3、插入 4、删除 5、销毁 编写测试main()函数测试算法的正确性。
时间: 2023-12-30 21:05:37 浏览: 76
数据结构课程设计平衡二叉排序树的三种基本功能:查找、插入、删除。
5星 · 资源好评率100%
好的,我可以为您解答这个问题。以下是实现二叉排序树的代码示例:
```c++
#include <iostream>
using namespace std;
// 二叉排序树的结点结构体定义
struct BSTNode {
int data;
BSTNode* left;
BSTNode* right;
};
// 创建新结点函数
BSTNode* CreateNode(int value) {
BSTNode* newNode = new BSTNode;
newNode->data = value;
newNode->left = nullptr;
newNode->right = nullptr;
return newNode;
}
// 插入结点函数
void InsertNode(BSTNode*& root, int value) {
if (root == nullptr) {
root = CreateNode(value);
} else if (value < root->data) {
InsertNode(root->left, value);
} else {
InsertNode(root->right, value);
}
}
// 查找结点函数
BSTNode* SearchNode(BSTNode* root, int value) {
if (root == nullptr || root->data == value) {
return root;
} else if (value < root->data) {
return SearchNode(root->left, value);
} else {
return SearchNode(root->right, value);
}
}
// 删除结点函数
void DeleteNode(BSTNode*& root, int value) {
if (root == nullptr) {
return;
} else if (value < root->data) {
DeleteNode(root->left, value);
} else if (value > root->data) {
DeleteNode(root->right, value);
} else {
// 找到要删除的结点
if (root->left == nullptr && root->right == nullptr) {
// 情况1:结点没有子节点
delete root;
root = nullptr;
} else if (root->left == nullptr) {
// 情况2:结点只有右子节点
BSTNode* temp = root;
root = root->right;
delete temp;
} else if (root->right == nullptr) {
// 情况3:结点只有左子节点
BSTNode* temp = root;
root = root->left;
delete temp;
} else {
// 情况4:结点有左右两个子节点
BSTNode* temp = root->right;
while (temp->left != nullptr) {
temp = temp->left;
}
root->data = temp->data;
DeleteNode(root->right, temp->data);
}
}
}
// 销毁树函数
void DestroyTree(BSTNode*& root) {
if (root == nullptr) {
return;
}
DestroyTree(root->left);
DestroyTree(root->right);
delete root;
root = nullptr;
}
// 中序遍历函数(用于测试)
void InOrderTraversal(BSTNode* root) {
if (root == nullptr) {
return;
}
InOrderTraversal(root->left);
cout << root->data << " ";
InOrderTraversal(root->right);
}
int main() {
// 测试建立二叉排序树
BSTNode* root = nullptr;
InsertNode(root, 8);
InsertNode(root, 3);
InsertNode(root, 10);
InsertNode(root, 1);
InsertNode(root, 6);
InsertNode(root, 14);
InsertNode(root, 4);
InsertNode(root, 7);
InsertNode(root, 13);
cout << "中序遍历结果:";
InOrderTraversal(root);
cout << endl;
// 测试查找结点
BSTNode* node = SearchNode(root, 6);
if (node == nullptr) {
cout << "未找到结点" << endl;
} else {
cout << "找到结点" << endl;
}
// 测试删除结点
DeleteNode(root, 10);
cout << "中序遍历结果:";
InOrderTraversal(root);
cout << endl;
// 测试销毁树
DestroyTree(root);
if (root == nullptr) {
cout << "树已销毁" << endl;
}
return 0;
}
```
在测试时,我们可以通过调用 `InsertNode` 函数来插入结点,调用 `SearchNode` 函数来查找结点,调用 `DeleteNode` 函数来删除结点,调用 `DestroyTree` 函数来销毁树。在测试中,我们还可以调用 `InOrderTraversal` 函数来中序遍历树,以确保二叉排序树的正确性。
阅读全文