C++ 二叉搜索树详解
1. 二叉搜索树的概念
二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:
- 若它的左子树不为空,则左子树上所有结点的值都小于等于根结点的值
- 若它的右子树不为空,则右子树上所有结点的值都大于等于根结点的值
- 它的左右子树也分别为二叉搜索树
- 二叉搜索树中可以支持插入相等的值,也可以不支持插入相等的值,具体看使用场景定义。后续学习 map/set/multimap/multiset 系列容器底层就是二叉搜索树,其中 map/set 不支持插入相等值,multimap/multiset 支持插入相等值。

2. 二叉搜索树的性能分析
最优情况下,二叉搜索树为完全二叉树 (或者接近完全二叉树),其高度为:log₂N 最差情况下,二叉搜索树退化为单支树 (或者类似单支),其高度为:N
所以综合而言二叉搜索树增删查改时间复杂度为:O(N)
因此单纯的二叉搜索树的效率不能满足我们的要求,后续二叉搜索树的变形比如 平衡搜索二叉树即 AVLTree,红黑树 RBTree,他们由于一些特殊的设计 使得二叉搜索树的效率接近 log₂N。
我们都知道有一个二分查找的算法可以快速帮我查询数据 其时间复杂度为 logN。那么大家是否有一个疑问为什么有了该算法后又要设计出搜索二叉树这种数据结构呢?
二分查找的缺陷:
需要存储在支持下标随机访问的结构中,并且有序。比如有序数组 插入和删除数据效率很低,因为存储在下标随机访问的结构中,插入和删除数据一般需要挪动数据。
正是二分查找的缺陷体现了二叉搜索树的价值。
最优二叉搜索树的大概情况:

最差二叉搜索树的大概情况:

3. 二叉搜索树的插入
插入的过程:
树为空,则直接新增结点,赋值给 root 指针 树不空,按二叉搜索树性质,插入值比当前结点大往右走,插入值比当前结点小往左走,找到空位置,插入新结点。如果支持插入相等的值,插入值跟当前结点相等的值可以往右走,也可以往左走,找到空位置,插入新结点。(要注意的是要保持逻辑一致性,插入相等的值不要一会往右走,一会往左走),具体设计自己决定
int a[] = {8,3,1,10,,,,,};






