C++ 二叉搜索树详解:增删查改与 Key/Value 场景实现
1. 二叉搜索树的概念
二叉搜索树(Binary Search Tree, BST),又称二叉排序树。它要么是一棵空树,要么满足以下性质:
- 若左子树不为空,则左子树上所有结点的值都小于等于根结点的值。
- 若右子树不为空,则右子树上所有结点的值都大于等于根结点的值。
- 左右子树也分别为二叉搜索树。
关于相等值的处理,具体取决于使用场景的定义。例如 STL 中的 set/map 不支持插入相等值,而 multiset/multimap 支持。后续代码实现中会体现这种差异。

2. 性能分析
在最优情况下,二叉搜索树接近完全二叉树,高度为 $\log_2 N$;而在最差情况下(如插入有序数据),树退化为单支树,高度为 $N$。
因此,综合而言,二叉搜索树的增删查改时间复杂度介于 $O(\log N)$ 到 $O(N)$ 之间。单纯的 BST 效率在某些极端场景下无法满足要求,这也是后续衍生出平衡搜索二叉树(如 AVL、红黑树)的原因。
为什么有了二分查找还要用二叉搜索树?
二分查找虽然查询快($O(\log N)$),但需要存储在支持随机访问的结构中(如有序数组)。一旦涉及插入和删除,就需要移动大量数据,效率较低。二叉搜索树正是为了弥补这一短板而生。

3. 二叉搜索树的插入
插入逻辑遵循 BST 的性质:
- 若树为空,直接将新结点作为根节点。
- 若树不空,从根节点开始比较:
- 插入值比当前结点大,往右走。
- 插入值比当前结点小,往左走。
- 找到空位置后插入新结点。
如果支持插入相等值,逻辑需保持一致性(例如统一往右走或统一往左走),避免逻辑混乱。
int a[] = {8, 3, 1, 10, 6, 4, 7, 14, 13};
插入过程演示:




