1、什么是二叉搜索树?
二叉搜索树又称二叉排序树,如图,它或者是一棵空树,或者是具有以下性质的二叉树:
• 左子树上所有节点的值都小于等于根结点的值; • 右子树上所有节点的值都大于等于根结点的值; • 它的左右子树也分别为二叉搜索树

注意: 二叉搜索树中可以支持插入相等的值,也可以不支持插入相等的值,具体看使用场景定义。后续学习 map/set/multimap/multiset 系列容器底层就是二叉搜索树,其中 map/set 不支持插入相等值,multimap/multiset 支持插入相等值。
2、二叉搜索树性能分析
在最优情况下,二叉搜索树为完全二叉树 (或者接近完全二叉树),其高度为:log2 N
最差情况下,二叉搜索树退化为单支树 (或者类似单支),其高度为:N

所以平均时间的时间复杂度为 O(log n),最差情况为 O(n)。
说明: 虽然二分查找也可以实现 O(log2 N) 级别的查找效率,但是二分查找有两大缺陷:
- 需要存储在支持下标随机访问的结构中,并且有序。
- 插入和删除数据效率很低,因为存储在下标随机访问的结构中,插入和删除数据一般需要挪动数据。
3、key 类型二叉搜索树的实现
为什么是 key 类型二叉搜索树呢?因为我们后面要讲的 set/multiset/map/multimap 容器的底层数据结构就红黑树(Red-Black Tree)—— 一种'近似平衡'的二叉搜索树(BST)。但不同的是,对于 set/multiset 容器,集合(Sets)是一种容器,它按照特定顺序存储唯一的元素。

节点结构
template<class K> struct BSTNode {
K _key; // 存储数据
BSTNode<K>* _left; // 指向左节点的指针
BSTNode<K>* _right; // 指向右节点的指针
BSTNode( K& key = ) :_key(key), _left(), _right() {}
};





