C++ 二叉搜索树详解
1. 二叉搜索树的概念
二叉搜索树(Binary Search Tree,BST)又称二叉排序树。它要么是一棵空树,要么满足以下性质:
- 若左子树不为空,则左子树上所有结点的值都小于等于根结点的值。
- 若右子树不为空,则右子树上所有结点的值都大于等于根结点的值。
- 左右子树也分别为二叉搜索树。
关于相等值的处理,具体取决于使用场景的定义。后续我们会看到,STL 中的 map/set 底层是二叉搜索树,它们不支持插入相等值;而 multimap/multiset 支持插入相等值。

2. 性能分析
最优情况下,二叉搜索树接近完全二叉树,高度为 $\log_2 N$,此时操作效率较高。最差情况下,树退化为单支树(类似链表),高度为 $N$,时间复杂度退化为 $O(N)$。
因此,单纯的二叉搜索树在某些极端数据下效率无法满足要求。这也是为什么后续会引入平衡搜索二叉树(如 AVLTree、红黑树 RBTree),通过特殊设计将效率稳定在 $O(\log_2 N)$ 级别。
为什么有了二分查找还要用二叉搜索树?
二分查找虽然查询快($O(\log N)$),但需要存储在支持随机访问的有序结构中(如数组)。一旦涉及插入和删除,就需要移动大量数据,效率很低。二叉搜索树正是为了弥补这一短板而生。

3. 二叉搜索树的插入
插入逻辑遵循 BST 的性质:
- 若树为空,直接将新结点赋值给
root。 - 若树不空,从根开始比较:
- 插入值比当前结点大,往右走。
- 插入值比当前结点小,往左走。
- 找到空位置后插入新结点。
如果支持插入相等值,当遇到相等值时,可以约定统一往左或往右走,保持逻辑一致性即可。
int a[] = {8, 3, 1, 10, 6, 4, 7, 14, 13};
插入过程示意图:




