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

2. 性能分析
二叉搜索树的效率高度依赖于树的形态:
- 最优情况:树接近完全二叉树,高度为 $\log_2 N$,操作复杂度为 $O(\log N)$。
- 最差情况:树退化为单支树(类似链表),高度为 $N$,操作复杂度降为 $O(N)$。
因此,单纯的二叉搜索树在某些极端数据下效率无法满足要求,这也是后续引入平衡搜索二叉树(如 AVL、红黑树)的原因。
为什么有了二分查找还需要二叉搜索树?
二分查找虽然查询快($O(\log N)$),但需要存储在支持随机访问的有序结构中(如数组)。一旦涉及频繁的插入和删除,数组需要移动大量数据,效率极低。二叉搜索树恰好弥补了这一短板,在保持较好查询效率的同时,优化了动态数据的维护成本。

3. 二叉搜索树的插入
插入逻辑相对直观:
- 如果树为空,直接将新节点设为根节点。
- 如果树不空,从根开始比较:
- 插入值比当前结点小,往左走。
- 插入值比当前结点大,往右走。
- 找到空位置后插入新节点。
对于支持重复值的场景,当遇到相等值时,可以约定统一往左或往右走,保持逻辑一致性即可。
int a[] = {8, 3, 1, 10, 6, 4, 7, 14, 13};




