C++ 二叉搜索树基础实现:增删查改详解
什么是二叉搜索树?
二叉搜索树(Binary Search Tree, BST),又称二叉排序树。它或者是一棵空树,或者是具有以下性质的二叉树:
- 左子树上所有节点的值都小于等于根结点的值;
- 右子树上所有节点的值都大于等于根结点的值;
- 它的左右子树也分别为二叉搜索树。

注意:二叉搜索树中可以支持插入相等的值,也可以不支持。具体取决于使用场景定义。例如
std::map/set不支持重复键,而multimap/multiset支持。后续学习容器底层结构时会涉及这些细节。
性能分析
在最优情况下,二叉搜索树为完全二叉树(或接近完全二叉树),其高度约为 log₂ N。
在最差情况下,二叉搜索树退化为单支树(类似链表),其高度为 N。

因此,平均时间复杂度为 O(log n),最差情况为 O(n)。
虽然二分查找也能达到 O(log₂ N) 的查找效率,但存在两大缺陷:
- 需要存储在支持下标随机访问的结构中,且数据必须有序。
- 插入和删除数据效率低,因为在下标结构中移动数据开销较大。
Key 类型二叉搜索树的实现
我们首先实现只存储 Key 的版本,这对应于 std::set/std::multiset 的底层逻辑。
节点与类结构
template<class K>
struct BSTNode {
K _key;
BSTNode<K>* _left;
BSTNode<K>* _right;
BSTNode(const K& key = 0)
:_key(key), _left(nullptr), _right(nullptr) {}
};
template<class K>
class BSTree {
using Node = BSTNode<K>;
:
:
Node* _root = ;
};


