一、二叉排序树(BST)
1.1定义
二叉排序树(也称为二叉查找树)或者是一颗空树,或者是具有下列特性的二叉树:
- 若左子树非空,则左子树上所有节点的值均
小于
根节点的值 - 若右子树非空,则右子树上所有结点的值均
大于
根节点的值 - 左、右子树也分别是一颗二叉排序树
根据二叉排序树的定义,左子树的结点值<根结点<右子树结点值,所以对二叉排序树进行
中序遍历
,可以得到一个递增有序序列
。
1.2二叉排序树的插入
若原二叉排序树为空,则直接插入结点;
否则,若关键字k小于根结点值,插入到左子树
关键字k大于根结点值,则插入到右子树
1.3二叉排序树的删除
-
被删除的结点为叶子结点,直接删除
-
被删除的结点只有左子树或者右子树,用其子树顶替其位置
- 举例子:若要删除的是60这个结点
- 只需要将60的子树代替他的位置即可
-
被删结点有左、右子树
- 方法一:可以用后继结点顶替,再删除后继结点(后继:左子树中右下的结点 )
- 方法二:可以用前驱结点顶替,再删除前驱结点(前驱结点:左子树中最右下的结点 )
- 举例子:若要删除的是50这个结点,由于他有左子树和右子树
- 使用方法一:由于我们二叉排序树进行中序遍历,可以得到一个递增的有序序列,
- 所以我们找到按照中序遍历的第一个结点,此结点一定是
右子树中值最小
的,为60 - 用最小的值(60)去替代,要删除的根节点,即可以保证排序树的特性不变
- 由于60是最左下的结点,所以他是没有左子树的,那么接下来就转变为没有左子树的情况,因此只要用他的右子树来代替即可
-
使用方法二:用前驱结点来替代(取当前结点左子树中最大的值来替代当前要被删除的结点)
-
最右下的结点是他的直接前驱(30),用30替代50
-
由于30是最右下的结点,所以他肯定没有右子树或者根结点的,则转换为第一种或者第二种情况
1.4二叉排序树的查找效率
二、平衡二叉树(AVL)
2.1定义
平衡二叉树——树上任一结点的左子树和右子树高度之差不超过1,只要有任意结点的平衡因子绝对值大于1
,就不是
平衡二叉树
结点的平衡因子 = 左子树高 - 右子树高
(平衡因子的值只可能是-1、0、1
)
2.2如何保持二叉树的平衡
从插入点往后找第一个不平衡的结点为根的子树,每次调整的对象都是“最小不平衡子树 ”
2.3平衡二叉树的插入
2.3.1调整最小不平衡子树
- 恢复平衡
- 保持二叉排序树特性
2.3.1“LL”——在A的左孩子的左子树插入导致A不平衡,将A的左孩子右上旋
2.3.2查找效率
2.3.3知识点回顾
2.4平衡二叉树的删除
例1:删除9
- 通过步骤1,由于是叶子结点直接删除;
- 通过步骤2 ,由于没有找到最小不平衡子树,所以直接删除9即可
例2:删除55(在删除9结点之后的图中) - 通过步骤1,由于55是叶子结点直接删除;
- 通过步骤2 ,找到最小不平衡子树(75),在删除55之后,75的左子树高度是60,右子树高度是3,出现不平衡现象
- 通过步骤3:调整不平衡,找到个头最高的“儿子、孙子”;
- 可以发现右边的个头最高,那么就是80这个结点
- 再从个头最高的“儿子”找到个头最高的孙子,可以发现是90
- 步骤4:调整平衡
因为孙子(90)在是在右孩子的右子树,则孙子是RR,所以儿子(80)左单旋转
- 步骤5:由于通过左旋后,50的右子树高度由4变成3,也会有可能导致80的祖先(50)出现不平衡的现象,所以这就是不平衡的向上传导现象
例3:删除32
- 进行右旋操作:
孙子(50)先右旋(到达78位置)让78成为50右的孩子,50原本的右孩子62变成78的左孩子- 再左旋(到达44)
- 再左旋(到达44)
- 再进行左单旋:
- 让50上升到最高位置(50代替44),左旋后44变成50的左孩子
- 让50上升到最高位置(50代替44),左旋后44变成50的左孩子
例子4:
2.5知识点回顾
重点领会例子1-4
三、散列表(哈希表)
3.1定义
散列表又称哈希表,是一种数据结构,特点:数据元素的关键字
与其存储地址
相关
3.2散列查找
查找成功:
查找失败:有的教材会把“空指针”的判定作为一次比较
查找成功平均长度:
查找失败的平均长度:
分子是存储了多少个,分母是散列表的长度
3.3装填因子
3.4设计散列函数
3.4.1除留余数法
首先要知道的概念:质数:除了能被1和自己整除之外,不能被其他数除
eg.8能被2、4除,所以不是
3、7都是质数
3.4.2直接定址法
适合分布连续的情况
3.4.3数字分析法
3.4.4平方取中法
3.5处理冲突方法
- 线性探测法
- 平方探测法
- 伪随机序列法