1、二叉排序树的定义
》》 二叉排序树(简称 BST),也称为“ 二叉查找树 ”。二叉查找树或者是一棵空树,或者是一棵具有下列
特性的非空二叉树:
a. 若左子树非空,则左子树上所有结点关键字值均小于根结点的关键字值
b. 若右子树非空,则右子树上所有结点关键子值均大于根结点的关键字值
c. 左、右子树本身也分别是一棵二叉排序树
》》 根据二叉排序树的定义,有 “ 左子树结点值 < 根结点值 < 右子树结点值 ” ,所以,对二叉排序树
进行中序遍历,可以得到一个递增的有序序列。
2、二叉排序树的查找
》》二叉排序树的查找:从根结点开始,沿某一个分支逐层向下进行比较的过程。若二叉排序树非空,将给定
值与根结点的关键字比较,若相等,则查找成功;若不等,则当根结点的关键字大于给定关键字值时,在
根结点的左子树中查找,否则在根结点的右子树中查找。
3、二叉排序树的插入
》》 二叉排序树作为一种动态集合,其特点是树的结构通常不是一次生成的,而是在查找过程中,当树中
不存在关键字等于给定值的结点时再进行插入。
》》 由于二叉排序树是递归定义的,插入结点的过程是:若原二叉排序树为空,则直接插入结点;否则,
若关键字 k 小于根结点关键字,则插入到左子树中,若关键字 k 大于根结点关键字,则插入到右子树中。
》》 插入的新结点一定是某个叶子结点。
4、二叉排序树的构造
》》 构造一棵二叉排序树就是依次输入数据元素,并将它们插入到二叉排序树中的适当位置上的过程。
具体的过程是,每读入一个元素,就建立一个新结点,若二叉树排序树非空,则将新结点的值与根
结点的值比较,如果小于根结点的值,则插入到左子树中,否则插入到右子树中;若二叉排序树为
空,则新结点作为二叉排序树的根结点。
5、二叉排序树的删除
》》 在二叉排序树中删除一个结点时,不能把以该结点为根的子树上的结点都删除,必须先把被删除结点
从存储二叉排序树的链表上摘下,将因删除结点而断开的二叉链表重新链接起来,同时确保二叉排序
树的性质不会丢失。
》》 删除操作的实现过程按 3 种情况来处理:
## 如果被删除结点 z 是叶结点,则直接删除,不会破坏二叉排序树的性质。
## 若结点 z 只有一棵左子树或者右子树,则让 z 的子树成为 z 父结点的子树,替代 z 的位置。
## 若结点 z 有左、右两棵子树,则令 z 的直接后继(或者直接前驱)替代 z ,然后从二叉排序
树中删去这个直接后继(或者直接前驱),这样就转换成了第一或者第二种情况。
6、二叉排序树的查找效率分析
》》 对于高度为 H 的二叉排序树,其插入和删除操作的运行时间都是 O( H ) 。但是在最坏情况下,
即构造二叉排序树的输入序列是有序的,则会形成一个倾斜的单支树,此时二叉排序树的性能显著
变坏,树的高度也增加为元素个数 N 。
》》二叉排序树查找算法的平均查找长度,主要取决于树的高度,即与二叉树的形态有关。
如果二叉排序树是一个只有右(左)孩子的单支树(类似于有序的单链表),其平均查找长度和
单链表相同,为 O( n ) 。如果二叉排序树的左、右子树的高度之差的绝对值不超过 1 ,这样的二叉
排序树称为平衡二叉树。它的平均查找长度达到 O() 。
》》 就维护表的有序性而言:
### 二叉排序树
无须移动结点,只需要修改指针即可完成插入和删除操作,平均时间为O()
### 二分查找
二分查找的对象是有序顺序表,若有插入和删除结点的操作,所花的代价是 O( n )
### 静态查找表
当有序表是静态查找表时,宜用顺序表作为其存储结构,而采用二分查找实现其
查找操作。
### 动态查找表
当有序表是动态查找表时,则应选择二叉排序树作为其逻辑结构。