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

2. 二叉搜索树的性能分析
在最优情况下,二叉搜索树接近完全二叉树,其高度为 log₂N;而在最差情况下,树退化为单支树(类似链表),高度为 N。
因此,综合而言,二叉搜索树增删查改的时间复杂度介于 O(logN) 到 O(N) 之间。
单纯的二叉搜索树效率在某些极端数据下无法满足要求,这也是后续衍生出平衡搜索二叉树(如 AVLTree、红黑树 RBTree)的原因,它们通过特殊设计将效率稳定在 log₂N 级别。
大家可能有个疑问:既然有了时间复杂度为 logN 的二分查找算法,为什么还要设计搜索二叉树?
二分查找的缺陷:
- 需要存储在支持下标随机访问的结构中,并且必须有序,例如有序数组。
- 插入和删除数据效率很低,因为存储在下标随机访问的结构中,插入和删除通常需要挪动大量数据。
正是二分查找的这些缺陷体现了二叉搜索树的价值。

3. 二叉搜索树的插入
插入过程遵循以下逻辑:
- 若树为空,则直接新增结点,赋值给 root 指针。
- 若树不空,按二叉搜索树性质比较:插入值比当前结点大往右走,小往左走。
- 找到空位置后插入新结点。
- 如果支持插入相等的值,插入值跟当前结点相等时可以往右或往左走,但需保持逻辑一致性。
int a[] = {8, 3, 1, 10, 6, 4, 7, 14, 13};
基于上述数据的二叉搜索树结构如下:






