本部分主要内容AVL树定义和适用范围调整平衡模式。插入
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
入双亲结点中如果满足分裂条件,那么双亲结点也按上述规律 分裂。最坏的情况:分裂到根结点,产生新的根结点
33
678 673 671 660 652 633 629 626 557
34
392 490 560 631 670
471 435 400 396 393
388 381 378 279 240 237
5
设最小不平衡子树的根为A,调整的规律可归纳 为下列四种: 1. LL型调整; 2. RR型调整; O(1) 3. LR型调整; 4. RL型调整; 上面的几种情况在经过平衡旋转处理后,新子树为平衡 二叉树,而且它的深度和插入之前子树相同。 因此,当平衡的二叉排序树因插入结点而失去平衡时,仅需 对最小不平衡子树进行旋转处理即可。
性能分析:
在B树是进行查找包含两种基本操作: (1)在B树中找结点; (磁盘上进行) (2)在结点中找关键字。(内存中进行)
而在磁盘上进行操作比在内存中操作慢得多,因此在磁盘上 进行查找的次数(每次要读外存),即待查关键字所在结点在B 树是的层次数,是决定B树查找效率的关键因素。
含n个关键字的m阶B树最大深度为log m/2(n+1)/2 + 1
typedef struct BTNode
*recPtr[m+1]; /* 指向文件中的记录号 */
28
二. B树的运算 B树的检索 key ki ki+1 pi
首先在根结点的关键码集合中进行检索,
1. 若key= = kj ,则检索成功;
2. 否则, key一定在ki 和 ki+1 之间(存在某个i), 沿pi继续查找,重复上述过程,直到检索成功, 或pi为空,检索失败。
平衡二叉树的深度和log2N是同数量级的
2
BF (balance facotor)
-1
-1
1 -1
-1
-2
1
0
0
0
-1
0
0
平衡和不平衡二叉树示例
3
6.5.1 调整平衡的模式
AVL树是为了解决最佳二叉树在新元素插入和删除上的 障碍引入的。对于AVL树中新元素的插入,是否会影响 树本身的平衡?如何进行调整? 27 -1 2 10 最小不平衡子树: 51 -1 1 18
RL型调整规则 设C为A的右子女的左子女,将A的孙子结点C提升为新二叉树的 根,原来C的父结点B连同其右子树δ向右下旋转成为新根C的 右子树,C的原右子树γ成为B的左子树;原来的根A连同其左 子树α向左下旋转成为新根C的左子树,原来C的左子树β成为 A的右子树。
17
-1 27 A -1
0 10 0 41 C 0 0 73 0 41 C -1 B 0 27 51 A 0 10 0 30 0 51 B 0
A -1 B B γ h hβ h α -1 γ hβ h h+1α hβ A -2 B 0 A
0
0
h α
γ h
8
-1 27 A
1
-2 27 A
10 B
0 05 0
10
B
27 A 0
0 10
B
0 05 -21 27 A -10 10 B
0 51
wenku.baidu.com
0 10 B
-1 0 05 0 18 0 03
-1
0 03
05 0 27 A
0 18 0 51
9
LL型调整操作示例
RR型调整
适用的条件:破坏平衡的原因是A的右子女(R)的右子 树(R)中插入结点,使得A的BF从1到2而失去平衡。
A A
1
B
2
B
α h
hβ
0
α h
hγ hβ
1
hγ
10
A 1
A 2
B 0
α h hβ
0
B
α h hγ hβ
31
1、B树的插入
深度为h的m阶B树,新结点一般插入到h层,首先检索到第 h层,确定插入结点位置。
(1)若被插入结点中关键码个数小于m-1,则插入。
(2)若被插入结点中关键码个数等于m-1,则结点“分裂”。
32
实现“分裂”方法:
关键字个数
假设*p结点中含有信息为:m,p0, (k1,p1), …, (km, pm)
045 112 236
分界符号
040 008
110 050
212 142 135
279 240 237
25
m和内外存交换的单位有关,一般m=1024, B树 主要用于文件的索引。
26
678 673 671 660 652 633 629 626 557 553 502 492 471 435 400 396 393 388 381 378 279 240 237
27
392 490 560 631 670
最多需要访 问几次外存?
045 112 236
212 142 135 110 050 040 008
一棵6阶的B树
375
结点类型可以如下说明:
#define m { int struct BTNode KeyType struct BTNode Record }BTNode, *BTree; keyNum; *parent; key[m+1]; *ptr[m+1]; /* 关键字个数 */ /* 指向父结点*/ /* 关键字向量 */ /* 子树指针向量 */ 3
24
(4) 有j个子女的非叶结点中恰好有j-1个关键码, 且 按递增顺 序排列,结点中包含的信息为: (p0, k1, p1, k2, …, kj-1, pj) 其中ki(i=1,..,j-1)为关键码,且ki < ki+1(i=1,…,j-2);
pi(i=0,…,j-1)为指向子树根结点的指针,且pi所指子树中所有 结点的关键码均大于ki,小于ki+1;
A 1 B A 2 B h α δ h γ h-1 -1 C 0
h
α
C 0
0
-1
δ h h-1
h-1 β
h β
γ
16
A -1 B
A -2 B h α C 1 δ h γ h-1 h β 1 δ h γ h-1 h α β h 0 A 0 δ
C 0 B -1 γ h-1 δ h
h α
C 0
0
h-1β
最小不平衡 0 25 子树 指离插入结点最 41 0 近,且以平衡因 插入结点 子绝对值大于1的 结点为根的子树。
4
为什么进行调整?
在AVL树上插入新的元素,不可避免的会引起树的平衡 出现变化。
因此,必须对插入元素后的树进行调整,才能保持树的 平衡特性。
其它操作呢?
结点的插入和删除操作,可以参见排序树的一般操作方 法。
点;若插入后使AVL树失去平衡,则*A是最小不平衡子树的根。
(2)修改一些结点的平衡因子 插入前,仅*A的平衡因子不为0。
插入后,从*A的子女开始,顺序扫描路径上(*A-新结点)的结
点*P,若新结点插入*P的左子树中,则*P平衡因子变为1;否则变 为-1。
19
(3)判别以*A为根的子树是否失去了平衡。
AVL树
本部分主要内容:
AVL树定义和适用范围 调整平衡模式。 插入一个结点的算法
1
平衡二叉树定义(AVL树)
它或者是一棵空树,或者是具有下列性质的二叉树:
它的左右子树均为平衡二叉树 左右子树的深度之差的绝对值不超过1
平衡因子BF(Balance Factor): 该结点的右子树的深度减去左子树的深度,在平衡二 叉树上所有结点平衡因子只可能为-1, 0, 1。
1
B
A
0
h+1 γ β h
hγ
hα
RR型调整规则 将A的右子女B提升为新二叉树的根;原来的根A连同其左子树 向左下旋转成为B的左子树;B的原左子树作为A的右子树。
11
1 27 A 0 51 B
-1 27 A 2 0 10 1 0 51 B 0 41 10 73 0 99
2
1
27 A 51 B
-1 27 A -2 0 51 B 10 1 1 41 0 0 73 C 0 30 0
0 73
RL型调整操作示例
18
插入元素的算法
包括以下几个部分:
20
设 在平衡二叉树上插入一个关键码为key的结点,算法中
(1)找最小不平衡子树。找插入位置时,令*A离插入位置最近, 且平衡因子不为0的结点,若这样的结点不存在,则A指向根结
045 112 236
212 142 135 110 050 040 008
一棵6阶B树的插入460前
553 502 492
375
629 626 557 560 631 670 553 502 492
0 27 0
51 A
B
0 73
73 0
0 51 B 1 0 27 73 A 0 10 0 41 0 99
RR型调整操作示例
12
LR型调整
适用的条件:破坏平衡的原因是A的左子女(L)的右子 树(R)中插入结点,使得A的BF从-1到-2而失去平衡。
A A -2
-1 B
0 0 h α h-1β γ h-1 C h α h β δ h
B
-1 C -1 δ h
γ h-1
13
A
A -2
C
-1 B
0 0 h α h-1β γ h-1 C h α hβ δ h
0 B A
-1
B
-1 -1 C δ h
0
h α γ h-1
β h γ
h-1 δ h
LR型调整规则 设C为A的左子女的右子女,将A的孙子结点C提升为新二叉树的 根;原C的父结点B连同其左子树α向左下旋转成为新根C的左子 树,原C的左子树β成为B的右子树;原根A连同其右子树δ向右 下旋转成为新根C的右子树,原C的右子树γ成为A的左子树。
将*p分裂为*p和*p’两个结点,分别含有信息为:
*p : m/2-1, p0, (k1,p1), …(k m/2-1,pm/2-1) *p’:(m- m/2, pm/2, (k m/2+1, p m/2+1), … (km, pm)
把关键字k m/2和指针*p’一起插入到*p的双亲结点中。插
29
678 673 671 660 652 633 629 626 557 553 502 492
30
392 490 560 631 670
471 435 400 396 393
388 381 378 279 240 237
375
045 112 236
Pi
212 142 135 110 050 040 008
若插入到*A的右子女的左子树,则采用RL型调整; 程序请大家自己分析一下
20
性能分析: 时间消耗主要包含2部分:
含有n个结点的平衡二叉树的高度是h= O(log2n)。插
入关键码为key的结点的时间耗费最大为树的深度
O(log2n)。
最小不平衡子树中平衡因子的调整时间最大为最小
不平衡子树的深度:O( 1 ). 因此, 整个算法的时间复杂度为 O(log2n).
14
-1
27 A 0 51 1
-2 27 A 10 B 0 51
0 10 B
0 05 0 18 C 0 18 C
0 05 -1 18 C 0 16
0 10 B 1 27 A 0 05 0 16 0 51
LR型调整操作示例
15
RL型调整
适用的条件:破坏平衡的原因是A的右子女(R)的左子 树(L)中插入结点,使得A的BF从1到2而失去平衡。
内存
外存
相关数据尽量存放在外 存的相关块中
数据结构和算法设计的基本原则:尽量少的访 问外存的次数。
23
B树
B树的定义
一棵m阶的B树,或为空树,或是满足下列特性的m叉树: (1)树中每个结点至多有m棵子树; (2) 除根之外的所有分支结点至少有m/2棵子树; (3)若根结点不是叶子结点,则至少有两棵子树; (4)所有叶子结点都在同一层上,可以看做外部结点, 不包含任何信息(实际上这些结点不存在)。
若*A的平衡因子为0,则插入后不会; 若*A的平衡因子为-1,且插入到*A的左子树,则失去平
衡;若插入到*A的左子女的左子树,则采用LL型调整;
若插入到*A的左子女的右子树,则采用LR型调整;
若*A的平衡因子为1, 且插入到*A的右子树,则失去平衡,
进一步,若插入到*A的右子女的右子树,则采用RR型调整;
6
LL型调整
适用的条件:破坏平衡的原因是A的左子女(L)的左子 树(L)中插入结点,使得A的BF从-1到-2而失去平衡。
A -1 B B γ h hβ h α -1 γ hβ h A -2
0
h α
7
LL型调整规则∶ 将A的左子女B提升为新二叉树的根;原来的根A连同 其右子树γ向右下旋转成为B的右子树;B的原右子 树β作为A的左子树。
21
平衡二叉排序树的检索效率与最佳二叉排序树的检
索效率是同级的;
最佳二叉排序树的检索效率是最好的,但是,当进
行结点的插入或删除操作后,保持其最佳性的时间 代价太大。因此适用与静态字典
动态字典常采用平衡二叉排序树作为存储结构。
22
B树和B+树*
B树和B+树用于外存文件的索引。
B树
B+树
33
678 673 671 660 652 633 629 626 557
34
392 490 560 631 670
471 435 400 396 393
388 381 378 279 240 237
5
设最小不平衡子树的根为A,调整的规律可归纳 为下列四种: 1. LL型调整; 2. RR型调整; O(1) 3. LR型调整; 4. RL型调整; 上面的几种情况在经过平衡旋转处理后,新子树为平衡 二叉树,而且它的深度和插入之前子树相同。 因此,当平衡的二叉排序树因插入结点而失去平衡时,仅需 对最小不平衡子树进行旋转处理即可。
性能分析:
在B树是进行查找包含两种基本操作: (1)在B树中找结点; (磁盘上进行) (2)在结点中找关键字。(内存中进行)
而在磁盘上进行操作比在内存中操作慢得多,因此在磁盘上 进行查找的次数(每次要读外存),即待查关键字所在结点在B 树是的层次数,是决定B树查找效率的关键因素。
含n个关键字的m阶B树最大深度为log m/2(n+1)/2 + 1
typedef struct BTNode
*recPtr[m+1]; /* 指向文件中的记录号 */
28
二. B树的运算 B树的检索 key ki ki+1 pi
首先在根结点的关键码集合中进行检索,
1. 若key= = kj ,则检索成功;
2. 否则, key一定在ki 和 ki+1 之间(存在某个i), 沿pi继续查找,重复上述过程,直到检索成功, 或pi为空,检索失败。
平衡二叉树的深度和log2N是同数量级的
2
BF (balance facotor)
-1
-1
1 -1
-1
-2
1
0
0
0
-1
0
0
平衡和不平衡二叉树示例
3
6.5.1 调整平衡的模式
AVL树是为了解决最佳二叉树在新元素插入和删除上的 障碍引入的。对于AVL树中新元素的插入,是否会影响 树本身的平衡?如何进行调整? 27 -1 2 10 最小不平衡子树: 51 -1 1 18
RL型调整规则 设C为A的右子女的左子女,将A的孙子结点C提升为新二叉树的 根,原来C的父结点B连同其右子树δ向右下旋转成为新根C的 右子树,C的原右子树γ成为B的左子树;原来的根A连同其左 子树α向左下旋转成为新根C的左子树,原来C的左子树β成为 A的右子树。
17
-1 27 A -1
0 10 0 41 C 0 0 73 0 41 C -1 B 0 27 51 A 0 10 0 30 0 51 B 0
A -1 B B γ h hβ h α -1 γ hβ h h+1α hβ A -2 B 0 A
0
0
h α
γ h
8
-1 27 A
1
-2 27 A
10 B
0 05 0
10
B
27 A 0
0 10
B
0 05 -21 27 A -10 10 B
0 51
wenku.baidu.com
0 10 B
-1 0 05 0 18 0 03
-1
0 03
05 0 27 A
0 18 0 51
9
LL型调整操作示例
RR型调整
适用的条件:破坏平衡的原因是A的右子女(R)的右子 树(R)中插入结点,使得A的BF从1到2而失去平衡。
A A
1
B
2
B
α h
hβ
0
α h
hγ hβ
1
hγ
10
A 1
A 2
B 0
α h hβ
0
B
α h hγ hβ
31
1、B树的插入
深度为h的m阶B树,新结点一般插入到h层,首先检索到第 h层,确定插入结点位置。
(1)若被插入结点中关键码个数小于m-1,则插入。
(2)若被插入结点中关键码个数等于m-1,则结点“分裂”。
32
实现“分裂”方法:
关键字个数
假设*p结点中含有信息为:m,p0, (k1,p1), …, (km, pm)
045 112 236
分界符号
040 008
110 050
212 142 135
279 240 237
25
m和内外存交换的单位有关,一般m=1024, B树 主要用于文件的索引。
26
678 673 671 660 652 633 629 626 557 553 502 492 471 435 400 396 393 388 381 378 279 240 237
27
392 490 560 631 670
最多需要访 问几次外存?
045 112 236
212 142 135 110 050 040 008
一棵6阶的B树
375
结点类型可以如下说明:
#define m { int struct BTNode KeyType struct BTNode Record }BTNode, *BTree; keyNum; *parent; key[m+1]; *ptr[m+1]; /* 关键字个数 */ /* 指向父结点*/ /* 关键字向量 */ /* 子树指针向量 */ 3
24
(4) 有j个子女的非叶结点中恰好有j-1个关键码, 且 按递增顺 序排列,结点中包含的信息为: (p0, k1, p1, k2, …, kj-1, pj) 其中ki(i=1,..,j-1)为关键码,且ki < ki+1(i=1,…,j-2);
pi(i=0,…,j-1)为指向子树根结点的指针,且pi所指子树中所有 结点的关键码均大于ki,小于ki+1;
A 1 B A 2 B h α δ h γ h-1 -1 C 0
h
α
C 0
0
-1
δ h h-1
h-1 β
h β
γ
16
A -1 B
A -2 B h α C 1 δ h γ h-1 h β 1 δ h γ h-1 h α β h 0 A 0 δ
C 0 B -1 γ h-1 δ h
h α
C 0
0
h-1β
最小不平衡 0 25 子树 指离插入结点最 41 0 近,且以平衡因 插入结点 子绝对值大于1的 结点为根的子树。
4
为什么进行调整?
在AVL树上插入新的元素,不可避免的会引起树的平衡 出现变化。
因此,必须对插入元素后的树进行调整,才能保持树的 平衡特性。
其它操作呢?
结点的插入和删除操作,可以参见排序树的一般操作方 法。
点;若插入后使AVL树失去平衡,则*A是最小不平衡子树的根。
(2)修改一些结点的平衡因子 插入前,仅*A的平衡因子不为0。
插入后,从*A的子女开始,顺序扫描路径上(*A-新结点)的结
点*P,若新结点插入*P的左子树中,则*P平衡因子变为1;否则变 为-1。
19
(3)判别以*A为根的子树是否失去了平衡。
AVL树
本部分主要内容:
AVL树定义和适用范围 调整平衡模式。 插入一个结点的算法
1
平衡二叉树定义(AVL树)
它或者是一棵空树,或者是具有下列性质的二叉树:
它的左右子树均为平衡二叉树 左右子树的深度之差的绝对值不超过1
平衡因子BF(Balance Factor): 该结点的右子树的深度减去左子树的深度,在平衡二 叉树上所有结点平衡因子只可能为-1, 0, 1。
1
B
A
0
h+1 γ β h
hγ
hα
RR型调整规则 将A的右子女B提升为新二叉树的根;原来的根A连同其左子树 向左下旋转成为B的左子树;B的原左子树作为A的右子树。
11
1 27 A 0 51 B
-1 27 A 2 0 10 1 0 51 B 0 41 10 73 0 99
2
1
27 A 51 B
-1 27 A -2 0 51 B 10 1 1 41 0 0 73 C 0 30 0
0 73
RL型调整操作示例
18
插入元素的算法
包括以下几个部分:
20
设 在平衡二叉树上插入一个关键码为key的结点,算法中
(1)找最小不平衡子树。找插入位置时,令*A离插入位置最近, 且平衡因子不为0的结点,若这样的结点不存在,则A指向根结
045 112 236
212 142 135 110 050 040 008
一棵6阶B树的插入460前
553 502 492
375
629 626 557 560 631 670 553 502 492
0 27 0
51 A
B
0 73
73 0
0 51 B 1 0 27 73 A 0 10 0 41 0 99
RR型调整操作示例
12
LR型调整
适用的条件:破坏平衡的原因是A的左子女(L)的右子 树(R)中插入结点,使得A的BF从-1到-2而失去平衡。
A A -2
-1 B
0 0 h α h-1β γ h-1 C h α h β δ h
B
-1 C -1 δ h
γ h-1
13
A
A -2
C
-1 B
0 0 h α h-1β γ h-1 C h α hβ δ h
0 B A
-1
B
-1 -1 C δ h
0
h α γ h-1
β h γ
h-1 δ h
LR型调整规则 设C为A的左子女的右子女,将A的孙子结点C提升为新二叉树的 根;原C的父结点B连同其左子树α向左下旋转成为新根C的左子 树,原C的左子树β成为B的右子树;原根A连同其右子树δ向右 下旋转成为新根C的右子树,原C的右子树γ成为A的左子树。
将*p分裂为*p和*p’两个结点,分别含有信息为:
*p : m/2-1, p0, (k1,p1), …(k m/2-1,pm/2-1) *p’:(m- m/2, pm/2, (k m/2+1, p m/2+1), … (km, pm)
把关键字k m/2和指针*p’一起插入到*p的双亲结点中。插
29
678 673 671 660 652 633 629 626 557 553 502 492
30
392 490 560 631 670
471 435 400 396 393
388 381 378 279 240 237
375
045 112 236
Pi
212 142 135 110 050 040 008
若插入到*A的右子女的左子树,则采用RL型调整; 程序请大家自己分析一下
20
性能分析: 时间消耗主要包含2部分:
含有n个结点的平衡二叉树的高度是h= O(log2n)。插
入关键码为key的结点的时间耗费最大为树的深度
O(log2n)。
最小不平衡子树中平衡因子的调整时间最大为最小
不平衡子树的深度:O( 1 ). 因此, 整个算法的时间复杂度为 O(log2n).
14
-1
27 A 0 51 1
-2 27 A 10 B 0 51
0 10 B
0 05 0 18 C 0 18 C
0 05 -1 18 C 0 16
0 10 B 1 27 A 0 05 0 16 0 51
LR型调整操作示例
15
RL型调整
适用的条件:破坏平衡的原因是A的右子女(R)的左子 树(L)中插入结点,使得A的BF从1到2而失去平衡。
内存
外存
相关数据尽量存放在外 存的相关块中
数据结构和算法设计的基本原则:尽量少的访 问外存的次数。
23
B树
B树的定义
一棵m阶的B树,或为空树,或是满足下列特性的m叉树: (1)树中每个结点至多有m棵子树; (2) 除根之外的所有分支结点至少有m/2棵子树; (3)若根结点不是叶子结点,则至少有两棵子树; (4)所有叶子结点都在同一层上,可以看做外部结点, 不包含任何信息(实际上这些结点不存在)。
若*A的平衡因子为0,则插入后不会; 若*A的平衡因子为-1,且插入到*A的左子树,则失去平
衡;若插入到*A的左子女的左子树,则采用LL型调整;
若插入到*A的左子女的右子树,则采用LR型调整;
若*A的平衡因子为1, 且插入到*A的右子树,则失去平衡,
进一步,若插入到*A的右子女的右子树,则采用RR型调整;
6
LL型调整
适用的条件:破坏平衡的原因是A的左子女(L)的左子 树(L)中插入结点,使得A的BF从-1到-2而失去平衡。
A -1 B B γ h hβ h α -1 γ hβ h A -2
0
h α
7
LL型调整规则∶ 将A的左子女B提升为新二叉树的根;原来的根A连同 其右子树γ向右下旋转成为B的右子树;B的原右子 树β作为A的左子树。
21
平衡二叉排序树的检索效率与最佳二叉排序树的检
索效率是同级的;
最佳二叉排序树的检索效率是最好的,但是,当进
行结点的插入或删除操作后,保持其最佳性的时间 代价太大。因此适用与静态字典
动态字典常采用平衡二叉排序树作为存储结构。
22
B树和B+树*
B树和B+树用于外存文件的索引。
B树
B+树