当前位置:实例文章 » JAVA Web实例» [文章]【C++】二叉搜索树

【C++】二叉搜索树

发布人:shili8 发布时间:2025-01-06 14:19 阅读次数:0

**二叉搜索树**

二叉搜索树(Binary Search Tree)是计算机科学中一个重要的数据结构。它是一种特殊的二叉树,每个结点最多有两个子结点,分别称为左孩子和右孩子。二叉搜索树的定义如下:

* 每个结点都有一个键(key),这个键是唯一的。
* 左孩子的所有键都小于父结点的键。
* 右孩子的所有键都大于父结点的键。

**二叉搜索树的特性**

二叉搜索树具有以下几个重要的特性:

1. **查找时间复杂度为O(h)**:其中h是树的高度。最坏情况下,树是完全不平衡的,这时查找时间复杂度为O(n),n是结点的数量。
2. **插入和删除操作的平均时间复杂度为O(log n)**:当树是平衡的时,插入和删除操作的平均时间复杂度为O(log n)。
3. **查找、插入和删除等操作都可以在O(1)的时间内完成**:如果我们使用一个额外的数组来存储结点的键值,这样就可以在O(1)的时间内找到或插入或删除一个结点。

**二叉搜索树的应用**

二叉搜索树有很多应用:

* **数据库索引**:许多数据库系统使用二叉搜索树作为索引结构,来快速查找和检索数据。
* **文件系统**:一些文件系统也使用二叉搜索树来组织文件和目录的结构。
* **编译器**:在编译器中,二叉搜索树可以用来存储符号表(symbol table),即变量名与其对应值之间的映射关系。

**C++实现**

下面是C++中一个简单的二叉搜索树的实现:

cpp#include <iostream>
using namespace std;

// 结点结构体struct Node {
 int key;
 Node* left;
 Node* right;
};

// 二叉搜索树类class BinarySearchTree {
public:
 // 构造函数 BinarySearchTree() : root(nullptr) {}

 // 销毁函数 ~BinarySearchTree() { destroyTree(root); }

 // 插入函数 void insert(int key) {
 if (root == nullptr) {
 root = new Node();
 root->key = key;
 root->left = root->right = nullptr;
 } else {
 insertNode(key, root);
 }
 }

 // 查找函数 bool search(int key) {
 return searchNode(key, root);
 }

 // 删除函数 void remove(int key) {
 root = removeNode(key, root);
 }

private:
 Node* root;

 // 插入结点函数 void insertNode(int key, Node*& node) {
 if (key < node->key) {
 if (node->left == nullptr) {
 node->left = new Node();
 node->left->key = key;
 node->left->left = node->left->right = nullptr;
 } else {
 insertNode(key, node->left);
 }
 } else if (key > node->key) {
 if (node->right == nullptr) {
 node->right = new Node();
 node->right->key = key;
 node->right->left = node->right->right = nullptr;
 } else {
 insertNode(key, node->right);
 }
 }
 }

 // 查找结点函数 bool searchNode(int key, Node* node) {
 if (node == nullptr) return false;

 if (key < node->key) {
 return searchNode(key, node->left);
 } else if (key > node->key) {
 return searchNode(key, node->right);
 }

 return true;
 }

 // 删除结点函数 Node* removeNode(int key, Node* node) {
 if (node == nullptr) return nullptr;

 if (key < node->key) {
 node->left = removeNode(key, node->left);
 } else if (key > node->key) {
 node->right = removeNode(key, node->right);
 } else {
 // 删除结点 if (node->left == nullptr && node->right == nullptr) {
 delete node;
 return nullptr;
 }

 if (node->left == nullptr) {
 Node* temp = node->right;
 delete node;
 return temp;
 }

 if (node->right == nullptr) {
 Node* temp = node->left;
 delete node;
 return temp;
 }

 // 找到最小结点 Node* minNode = findMin(node->right);
 node->key = minNode->key;

 // 删除最小结点 node->right = removeNode(minNode->key, node->right);
 }

 return node;
 }

 // 销毁函数 void destroyTree(Node* node) {
 if (node == nullptr) return;

 destroyTree(node->left);
 destroyTree(node->right);

 delete node;
 }

 // 找到最小结点函数 Node* findMin(Node* node) {
 while (node->left != nullptr) {
 node = node->left;
 }
 return node;
 }
};

int main() {
 BinarySearchTree bst;

 bst.insert(5);
 bst.insert(3);
 bst.insert(7);
 bst.insert(2);
 bst.insert(4);
 bst.insert(6);
 bst.insert(8);

 cout << "是否存在5: " << (bst.search(5) ? "Yes" : "No") << endl;
 cout << "是否存在9: " << (bst.search(9) ? "Yes" : "No") << endl;

 bst.remove(5);
 cout << "是否存在5: " << (bst.search(5) ? "Yes" : "No") << endl;

 return0;
}


上面的代码实现了一个简单的二叉搜索树,支持插入、查找和删除操作。

其他信息

其他资源

Top