AVL树插入
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0
插入后
p
pr
-1
3. 结点pr的平衡因子的绝对值|bf| = 2。 说明新结点在较高的子树上插入,造 成了不平衡,需要做平衡化旋转。此 时可进一步分2种情况讨论:
若结点pr的bf = 2,说明右子树高,结 合其右子女q 的bf分别处理:
─
若q的bf为1,执行左单旋转。
2
pr
0
q pr
pr=q
加DEC
DEC
加OCT 加FEB
DEC
加JUL
FEB
加NOV
DEC
+2
DEC
FEB
FEB
FEB
FEB
NOV
DEC
NOV
DEC
NOV
NOV
OCT
JUL
OCT
左单旋转
DEC,FEB,NOV,OCT,JUL,SEP,AUG,APR,MAR,MAY,JUN,JAN
加SEP
FEB
加AUG
+2
NOV
NOV
NOV
0 11
11 0
7
3
2014-6-30
18
9 0 16 0 26 3
7
-1
9 16 0 14
1 18
26
4
序列{ 16, 3, 7, 11, 9, 26, 18, 14, 15 } 2 11 2 右左双旋 7 18 2 3 9 16 26 3
LOGO
-
1 11
7 9 0 14 0 15
-1
18 26 0 16
-1 p
1
p
右单旋转
左右双旋转
[知识点三] AVL 树的插入
[课本343页7.15]将关键码DEC,FEB,NOV,OCT,JUL,SEP,AUG, APR,MAR,MAY,JUN,JAN依次插入到一棵初始为空的AVL树中, 画出每插入一个关键码后的AVL树,并标明平衡旋转的类型。 问题分析:
题目中的关键码DEC,FEB,NOV,OCT, JUL,SEP,AUG,APR,MAR,MAY,JUN,JAN要 求按英文字母顺序而不是按照月份插入的,故 切不可理解成月份进行插入。 按照英文字母顺序意思是A最小,如果开 头一样,就比较第二个字母。。。以此类推
6.3.3 AVL树的插入
在向一棵本来是高度平衡的AVL树中插入一个新结点时,如果树 中某个结点的平衡因子的绝对值 |bf| > 1,则出现了不平衡,需要 做平衡化处理。 AVL树的插入算法从一棵空树开始,通过输入一系列对象关键码 ,逐步建立AVL树。 在插入新结点后,需从插入结点沿通向根的路径向上回溯,如果 发现有不平衡的结点,需从这个结点出发,使用平衡旋转方法进 行平衡化处理。
-
14
1 0 15
2014-6-30
5
设新结点p的平衡因子为0,其父结点为pr。插入 新结点后pr的平衡因子值有三种情况:
1. 结点pr的平衡因子为0。说明刚才是在pr的较矮 的子树上插入了新结点,此时不需做平衡化处理, 返回主程序。子树的高度不变。
pr
1
插入后
p
0
2. 结点pr的平衡因子的绝对值|bf| = 1。说明插入前 pr的平衡因子是0,插入新结点后,以pr为根的子 树不需平衡化旋转。但该子树高度增加,还需从结 点pr向根方向回溯,继续考查结点pr双亲(pr = Parent(pr))的平衡状态。
{ 16, 3, 7, 11, 9, 26, 18, 14, 15 },插入和调整过程如下: 序列{ 16, 3, 7, 11, 9, 26, 18, 14, 15 } 0 1 2 16 16 16 左右双旋 0 1 0 3 3 3 0 7
LOGO
-
-
0 7
0 16
1 7
3
0 11
-1 16
2 7
1
7 16
-1 插入结点9
7 3
0
-2
7
3
0
0
3
0
16 右单旋 -1 11
11
0
9
16
11
9
步骤 V指向结点 U指向结点 处理 9,bal(v)=0 11,bal(u)=0-1=-1 符合AVL树插入的情 1 形2:继续考察11(u) 父结点16 11,bal(v)= 16,bal(u)=-1-1=- 情形3中的情形1:做 2 1 2 一次右单旋转即结束 平衡过程
DEC
JUL
MAY
MAY
DEC,FEB,NOV,OCT,JUL,SEP,AUG,APR,MAR,MAY,JUN,JAN
加JUN
NOV
-2
OCT
MAR
FEB
左右旋转
SEP AUG
FEB
NOV
AUG
MAR
JUL
MAY
OCT
APR
DEC
JUL
MAY
APR
SEP DEC JUN
JUN
DEC,FEB,NOV,OCT,JUL,SEP,AUG,APR,MAR,MAY,JUN,JAN
JUL
SEP
AUG
JUL
SEP
AUG
APR
DEC
APR
DEC
MAR
APR
右单旋转
DEC,FEB,NOV,OCT,JUL,SEP,AUG,APR,MAR,MAY,JUN,JAN
加MAY
NOV NOV
FEB
OCT
FEB
OCT
+2
AUG JUL SEP
左单旋转
AUG MAR SEP
APR
DEC
MAR
APR
左单旋转
FEB OCT FEB OCT
DEC
JUL
OCT
DEC
JUL
SEP
DEC
JUL
SEP
SEP
AUG
DEC,FEB,NOV,OCT,JUL,SEP,AUG,APR,MAR,MAY,JUN,JAN
加APR
NOV NOV
加MAR
NOV
FEB
OCT
FEB
OCT
FEB
OCT
-2
DEC
JUL
SEP
AUG
加JAN
MAR
FEB
NOV
AUG
JUL
MAY
OCT
APR
DEC
JAN
JUN
SEP
DEC,FEB,NOV,OCT,JUL,SEP,AUG,APR,MAR,MAY,JUN,JAN
插入后
1
左单旋转
p
0
p
─
若q的bf为-1,执行先右后左双旋转。 2
pr -1 p q 右左双旋转 pr pr=p q
插入后
0
0
若结点pr的bf = -2,说明左子树高,结合 其左子女q 的bf分别处理:
─ ─
若q的bf为-1,执行右单旋转; 若q的bf为1,执行先左后右双旋转。
-2 pr -2 pr q q
-2
Leabharlann Baidu16
1 7 右单旋
3
0 9
2014-6-30
-1
11
3
0 9
0 11
2 7 0 16
3
9
1 11
1 16
0 26
3
序列{ 16, 3, 7, 11, 9, 26, 18, 14, 15 }
左单旋 11 7 3 9
LOGO
0
1 16 26 3 7
0
11
1
2 16 0 18 1 左右双旋
9
26
-1
插入后
p
pr
-1
3. 结点pr的平衡因子的绝对值|bf| = 2。 说明新结点在较高的子树上插入,造 成了不平衡,需要做平衡化旋转。此 时可进一步分2种情况讨论:
若结点pr的bf = 2,说明右子树高,结 合其右子女q 的bf分别处理:
─
若q的bf为1,执行左单旋转。
2
pr
0
q pr
pr=q
加DEC
DEC
加OCT 加FEB
DEC
加JUL
FEB
加NOV
DEC
+2
DEC
FEB
FEB
FEB
FEB
NOV
DEC
NOV
DEC
NOV
NOV
OCT
JUL
OCT
左单旋转
DEC,FEB,NOV,OCT,JUL,SEP,AUG,APR,MAR,MAY,JUN,JAN
加SEP
FEB
加AUG
+2
NOV
NOV
NOV
0 11
11 0
7
3
2014-6-30
18
9 0 16 0 26 3
7
-1
9 16 0 14
1 18
26
4
序列{ 16, 3, 7, 11, 9, 26, 18, 14, 15 } 2 11 2 右左双旋 7 18 2 3 9 16 26 3
LOGO
-
1 11
7 9 0 14 0 15
-1
18 26 0 16
-1 p
1
p
右单旋转
左右双旋转
[知识点三] AVL 树的插入
[课本343页7.15]将关键码DEC,FEB,NOV,OCT,JUL,SEP,AUG, APR,MAR,MAY,JUN,JAN依次插入到一棵初始为空的AVL树中, 画出每插入一个关键码后的AVL树,并标明平衡旋转的类型。 问题分析:
题目中的关键码DEC,FEB,NOV,OCT, JUL,SEP,AUG,APR,MAR,MAY,JUN,JAN要 求按英文字母顺序而不是按照月份插入的,故 切不可理解成月份进行插入。 按照英文字母顺序意思是A最小,如果开 头一样,就比较第二个字母。。。以此类推
6.3.3 AVL树的插入
在向一棵本来是高度平衡的AVL树中插入一个新结点时,如果树 中某个结点的平衡因子的绝对值 |bf| > 1,则出现了不平衡,需要 做平衡化处理。 AVL树的插入算法从一棵空树开始,通过输入一系列对象关键码 ,逐步建立AVL树。 在插入新结点后,需从插入结点沿通向根的路径向上回溯,如果 发现有不平衡的结点,需从这个结点出发,使用平衡旋转方法进 行平衡化处理。
-
14
1 0 15
2014-6-30
5
设新结点p的平衡因子为0,其父结点为pr。插入 新结点后pr的平衡因子值有三种情况:
1. 结点pr的平衡因子为0。说明刚才是在pr的较矮 的子树上插入了新结点,此时不需做平衡化处理, 返回主程序。子树的高度不变。
pr
1
插入后
p
0
2. 结点pr的平衡因子的绝对值|bf| = 1。说明插入前 pr的平衡因子是0,插入新结点后,以pr为根的子 树不需平衡化旋转。但该子树高度增加,还需从结 点pr向根方向回溯,继续考查结点pr双亲(pr = Parent(pr))的平衡状态。
{ 16, 3, 7, 11, 9, 26, 18, 14, 15 },插入和调整过程如下: 序列{ 16, 3, 7, 11, 9, 26, 18, 14, 15 } 0 1 2 16 16 16 左右双旋 0 1 0 3 3 3 0 7
LOGO
-
-
0 7
0 16
1 7
3
0 11
-1 16
2 7
1
7 16
-1 插入结点9
7 3
0
-2
7
3
0
0
3
0
16 右单旋 -1 11
11
0
9
16
11
9
步骤 V指向结点 U指向结点 处理 9,bal(v)=0 11,bal(u)=0-1=-1 符合AVL树插入的情 1 形2:继续考察11(u) 父结点16 11,bal(v)= 16,bal(u)=-1-1=- 情形3中的情形1:做 2 1 2 一次右单旋转即结束 平衡过程
DEC
JUL
MAY
MAY
DEC,FEB,NOV,OCT,JUL,SEP,AUG,APR,MAR,MAY,JUN,JAN
加JUN
NOV
-2
OCT
MAR
FEB
左右旋转
SEP AUG
FEB
NOV
AUG
MAR
JUL
MAY
OCT
APR
DEC
JUL
MAY
APR
SEP DEC JUN
JUN
DEC,FEB,NOV,OCT,JUL,SEP,AUG,APR,MAR,MAY,JUN,JAN
JUL
SEP
AUG
JUL
SEP
AUG
APR
DEC
APR
DEC
MAR
APR
右单旋转
DEC,FEB,NOV,OCT,JUL,SEP,AUG,APR,MAR,MAY,JUN,JAN
加MAY
NOV NOV
FEB
OCT
FEB
OCT
+2
AUG JUL SEP
左单旋转
AUG MAR SEP
APR
DEC
MAR
APR
左单旋转
FEB OCT FEB OCT
DEC
JUL
OCT
DEC
JUL
SEP
DEC
JUL
SEP
SEP
AUG
DEC,FEB,NOV,OCT,JUL,SEP,AUG,APR,MAR,MAY,JUN,JAN
加APR
NOV NOV
加MAR
NOV
FEB
OCT
FEB
OCT
FEB
OCT
-2
DEC
JUL
SEP
AUG
加JAN
MAR
FEB
NOV
AUG
JUL
MAY
OCT
APR
DEC
JAN
JUN
SEP
DEC,FEB,NOV,OCT,JUL,SEP,AUG,APR,MAR,MAY,JUN,JAN
插入后
1
左单旋转
p
0
p
─
若q的bf为-1,执行先右后左双旋转。 2
pr -1 p q 右左双旋转 pr pr=p q
插入后
0
0
若结点pr的bf = -2,说明左子树高,结合 其左子女q 的bf分别处理:
─ ─
若q的bf为-1,执行右单旋转; 若q的bf为1,执行先左后右双旋转。
-2 pr -2 pr q q
-2
Leabharlann Baidu16
1 7 右单旋
3
0 9
2014-6-30
-1
11
3
0 9
0 11
2 7 0 16
3
9
1 11
1 16
0 26
3
序列{ 16, 3, 7, 11, 9, 26, 18, 14, 15 }
左单旋 11 7 3 9
LOGO
0
1 16 26 3 7
0
11
1
2 16 0 18 1 左右双旋
9
26
-1