【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; }
上面的代码实现了一个简单的二叉搜索树,支持插入、查找和删除操作。