用C++使用链表实现二叉排序树,其中包括创建、查找、插入、删除、销毁功能并通过main()函数测试正确性
时间: 2023-07-10 18:22:43 浏览: 98
C++二叉排序树的创建、插入、删除、查找
5星 · 资源好评率100%
好的,以下是C++使用链表实现二叉排序树的代码:
```c++
#include <iostream>
using namespace std;
// 二叉排序树结点定义
struct BSTNode {
int val;
BSTNode* left;
BSTNode* right;
};
// 创建新结点
BSTNode* createNode(int val) {
BSTNode* node = new BSTNode;
node->val = val;
node->left = nullptr;
node->right = nullptr;
return node;
}
// 查找结点
BSTNode* findNode(BSTNode* root, int val) {
if (root == nullptr || root->val == val) {
return root;
} else if (val < root->val) {
return findNode(root->left, val);
} else {
return findNode(root->right, val);
}
}
// 插入结点
BSTNode* insertNode(BSTNode* root, int val) {
if (root == nullptr) {
return createNode(val);
} else if (val < root->val) {
root->left = insertNode(root->left, val);
} else {
root->right = insertNode(root->right, val);
}
return root;
}
// 删除结点
BSTNode* deleteNode(BSTNode* root, int val) {
if (root == nullptr) {
return root;
} else if (val < root->val) {
root->left = deleteNode(root->left, val);
} else if (val > root->val) {
root->right = deleteNode(root->right, val);
} else {
if (root->left == nullptr) {
BSTNode* temp = root->right;
delete root;
return temp;
} else if (root->right == nullptr) {
BSTNode* temp = root->left;
delete root;
return temp;
}
BSTNode* temp = root->right;
while (temp->left != nullptr) {
temp = temp->left;
}
root->val = temp->val;
root->right = deleteNode(root->right, temp->val);
}
return root;
}
// 销毁树
void destroyTree(BSTNode* root) {
if (root == nullptr) {
return;
}
destroyTree(root->left);
destroyTree(root->right);
delete root;
}
// 测试函数
void test() {
BSTNode* root = nullptr;
root = insertNode(root, 5);
insertNode(root, 3);
insertNode(root, 7);
insertNode(root, 1);
insertNode(root, 9);
insertNode(root, 4);
insertNode(root, 8);
insertNode(root, 2);
cout << "插入后的树:" << endl;
// 中序遍历二叉排序树
// 遍历结果应该是 1 2 3 4 5 7 8 9
// 如果结果不对,说明插入或查找有问题
inorderTraversal(root);
cout << endl;
deleteNode(root, 5);
cout << "删除结点5后的树:" << endl;
// 中序遍历二叉排序树
// 遍历结果应该是 1 2 3 4 7 8 9
// 如果结果不对,说明删除有问题
inorderTraversal(root);
cout << endl;
destroyTree(root);
}
int main() {
test();
return 0;
}
```
代码中包括了创建、查找、插入、删除、销毁二叉排序树的功能,并通过 `main()` 函数进行了测试。其中,中序遍历二叉排序树用于验证插入、删除操作的正确性。
阅读全文