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

2. 性能分析
二叉搜索树的效率高度依赖于树的高度。
- 最优情况:树为完全二叉树或接近完全二叉树,高度约为 $\log_2 N$。此时增删查改的时间复杂度为 $O(\log N)$。
- 最差情况:树退化为单支树(类似链表),高度为 $N$。此时时间复杂度退化为 $O(N)$。
因此,单纯的二叉搜索树在极端数据下效率无法满足要求。这也是后续衍生出平衡搜索二叉树(如 AVLTree、红黑树 RBTree)的原因,它们通过特殊设计将效率稳定在 $O(\log N)$ 级别。
相比二分查找,二叉搜索树的优势在于:二分查找需要有序数组且不支持高效的插入删除(需移动数据),而二叉搜索树天然支持动态的增删操作。

3. 二叉搜索树的插入
插入逻辑遵循 BST 性质:
- 若树为空,直接将新节点设为根节点。
- 若树不空,从根节点开始比较:
- 插入值 < 当前节点值:向左走。
- 插入值 > 当前节点值:向右走。
- 插入值 == 当前节点值:根据是否支持重复值决定走向(通常往右或往左保持一致即可)。
- 找到空位置后插入新节点。
以数组 {8, 3, 1, 10, 6, 4, 7, 14, 13} 为例构建的树如下:

继续插入 16 和 13 后的状态:




