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

性能分析
二叉搜索树的效率高度依赖于树的形态。
- 最优情况:树接近完全二叉树,高度为 $\log_2 N$,此时增删查改的时间复杂度为 $O(\log N)$。
- 最差情况:树退化为单支树(类似链表),高度为 $N$,时间复杂度降为 $O(N)$。
单纯二叉搜索树的效率在极端情况下无法满足要求,这也是后续引入平衡搜索二叉树(如 AVLTree、红黑树 RBTree)的原因,它们通过特殊设计将效率稳定在 $O(\log N)$ 级别。
为什么有了二分查找还需要二叉搜索树?
二分查找虽然查询快($O(\log N)$),但存在明显缺陷:
- 需要存储在支持下标随机访问的结构中(如数组)。
- 数据必须有序。
- 插入和删除效率低,因为需要移动大量数据以维持有序性。
二叉搜索树弥补了这些短板,既保持了较快的查询速度,又提供了灵活的动态插入和删除能力。

插入操作
插入过程遵循二叉搜索树的性质:
- 若树为空,直接将新结点赋值给
root指针。 - 若树不空,从根节点开始比较:
- 插入值比当前结点小,往左走。
- 插入值比当前结点大,往右走。
- 找到空位置后插入新结点。
如果支持插入相等值,逻辑上可以统一规定(例如一律往右走),保持逻辑一致性即可。
int a[] = {8, 3, 1, 10, 6, 4, , , };





