二叉搜索树:C++ 实现
一、什么是二叉搜索树?
二叉搜索树(Binary Search Tree,BST)是一种基于二叉树的数据结构,满足以下特性:
- 左子树所有节点值 < 根节点值
- 右子树所有节点值 > 根节点值
- 左右子树本身也是二叉搜索树
例如,下图是一棵二叉搜索树:
6/ \3 8/ \ \1 4 9二、操作实现(C++)
1. 结点定义
template <class K>
struct BSTNode {K _key; // 节点值BSTNode* _left; // 左子树BSTNode* _right; // 右子树BSTNode(const K& key): _key(key), _left(nullptr), _right(nullptr) {}
};2. 插入操作
template <class K>
class BSTree {
public:void Insert(const K& key) {if (_root == nullptr) {_root = new BSTNode<K>(key);return;}BSTNode<K>* parent = nullptr;BSTNode<K>* cur = _root;while (cur) {if (key < cur->_key) {parent = cur;cur = cur->_left;} else if (key > cur->_key) {parent = cur;cur = cur->_right;} else {return; // 重复值不插入}}if (key < parent->_key) {parent->_left = new BSTNode<K>(key);} else {parent->_right = new BSTNode<K>(key);}}private:BSTNode<K>* _root = nullptr;
};3. 查找操作
bool Find(const K& key) {BSTNode<K>* cur = _root;while (cur) {if (key > cur->_key) {cur = cur->_right;} else if (key < cur->_key) {cur = cur->_left;} else {return true; // 找到目标}}return false; // 未找到
}4. 中序遍历(验证有序性)
void InOrder() {_InOrder(_root);
}void _InOrder(BSTNode<K>* root) {if (root == nullptr) return;_InOrder(root->_left);cout << root->_key << " ";_InOrder(root->_right);
}三、复杂度
| 操作 | 平均时间复杂度 | 最坏时间复杂度 |
|---|---|---|
| 插入 | O(log n) | O(n) |
| 查找 | O(log n) | O(n) |
| 删除 | O(log n) | O(n) |
注意:最坏情况是树退化为链表(如按顺序插入),此时性能接近线性表。为避免这种情况,可使用平衡二叉搜索树(如 AVL 树、红黑树)。
总结
- 优点:插入、查找、删除操作平均效率高,结构灵活。
- 缺点:最坏情况下性能退化,需通过平衡树优化。
- 进阶方向:学习 AVL 树、红黑树等自平衡二叉搜索树。
二叉搜索树 = 有序 + 二叉树
