高度平衡的二叉树

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
高度平衡的二叉搜索树
AVL( Addison-Velski and Landis )树 伸展树 红黑树

二叉搜索树性能分析

对于有 n 个关键码的集合,其关键码有 n! 种 不同排列,可构成不同二叉搜索树有 1 n C 2 n (棵)
n 1
{2, 1, 3} {1, 2, 3} {1, 3, 2} {2, 3, 1} {3, 1, 2} {3, 2, 1}
B
BRAຫໍສະໝຸດ AR中序序列:BL
B
BR
A
AR
注意:改组后
B
A
平衡度为 0
2)RR平衡旋转: 若在A的右子树的右子树上插入结点,使A的平衡
因子从-1增加至-2,需要进行一次逆时针旋转。
(以B为旋转轴)
A B A C
左单旋转 (RotateLeft )
+1
A
0
+2
A
+1
C C A
0
0
B h D h
(a)
C E
Double Rotations
Fig. 28-5 (a) Adding 70 to the tree in Fig. 28-2c destroys its balance; to restore the balance, perform both (b) a right rotation and (c) a left rotation.
h
B
E
h D h
(b)
E
h + 1
B
h
D h + h 1
(c)
如果在子树E中插入一个新结点,该子树高度增1导致 结点A的平衡因子变成+2,出现不平衡。 沿插入路径检查三个结点A、C和E。它们处于一条方 向为“\”的直线上,需要做左单旋转。 以结点C为旋转轴,让结点A反时针旋转。
3)LR平衡旋转:
若在A的左子树的右子树上插入结点,使A的平
由此可知,图(c)和图(e)的情形下树的平均搜索 长度达到最小,因此,图(c)和图(e)的情形是最 优二叉搜索树。

一般把平均搜索长度达到最小的扩充的 二叉搜索树称作最优二叉搜索树。 等概率条件下,最优二叉搜索树的最短 内部路径长度与最短外部路径长度, 课本 n 383页: I log2 i .
i 1

E
2n 1
i n 1
log i 1.
2
平衡二叉树
☞ 一、什么是平衡二叉树 二、失衡二叉排序树的分析与调 整
平衡二叉树又称为AVL树。 一棵平衡二叉树或者是空树,或者是具有下列性质 的二叉排序树: ① 左子树与右子树的高度之差的绝对值小于等于1; ② 左子树和右子树也是平衡二叉排序树。
例:下图对平衡二叉树和失去平衡的二叉排序树分别 标注了平衡因子。
-1 40
-1 40
-1 53 -1 24
-1 24
0 28 0 45
-2 53
0 28 0 60 1 70
1 70
0 60
平衡二叉树
一、什么是平衡二叉树 ☞ 二、失衡二叉排序树的分析与调 整
如果在一棵AVL树中插入一个新结点,就有可能造
BL
h-2
C
AR
h-1
h-1
CL
CR
h-2
改组后: 高度为 h + 1 中序序列: BL
改组前:
高度为 h + 1 中序序列: BL
B
CL
C
CR
A
AR
B
CL
C
CR
A
AR
注意:改组后
B
C
A
平衡度为 0,0,-1
Double Rotations
Fig. 28-7 (a) The AVL tree in Fig. 28-5 after additions that maintain its balance; (b) after an addition that destroys the balance … continued →
ASLsucc p[i ] * l [i ].
i 1
n

设各关键码的搜索概率相等:p[i] = 1/n
ASLsucc 1 n l [i ]. n i 1

搜索不成功的平均搜索长度ASLunsucc为树中所 有外部结点上搜索概率q[j]与到达外部结点所 需关键码比较次数c'[j](= l'[j])乘积之和:
to p3=0.05 if p2=0.1 do p1=0.5 q0=0.15 q3=0.05 if p1=0.5 do
p2=0.1
p3=0.05 to q3= q2=0.05 0.05 q1=0.1 q0=0.15 q1=0.1 q2=0.05
(a)
(b)
图(a): ASLsucc = 0.5*3+0.1*2+0.05*1 = 1.75, ASLunsucc = 0.15*3+0.1*3+0.05*2+ 0.05*1 = 0.9。 图(b): ASLsucc = 0.5*2+0.1*1+0.05*2 = 1.2, ASLunsucc = (0.15+0.1+0.05+0.05)*2 = 0.7。
ASLunsucc q[ j ] * (l '[ j ] 1).
j 0 n

设外部结点搜索概率相等:q[j] = 1/(n+1): 1 n ASLunsucc (l' [ j] 1). n 1 j 0
(1) 相等搜索概率的情形

设树中所有内、外部结点的搜索概率都相等: p[i] = 1/3, 1≤i≤3, q[j] = 1/4, 0≤ j≤3 图(a): ASLsucc = 1/3*3+1/3*2+1/3*1 = 6/3, ASLunsucc = 1/4*3*2+1/4*2+1/4*1 = 9/4。 图(b): ASLsucc = 1/3*2*2+1/3*1 = 5/3, ASLunsucc = 1/4*2*4 = 8/4。 图(c): ASLsucc = 1/3*1+1/3*2+1/3*3 = 6/3, ASLunsucc = 1/4*1+1/4*2+1/4*3*2 = 9/4。 图(d): ASLsucc = 1/3*2+1/3*3+1/3*1 = 6/3, ASLunsucc = 1/4*2+1/4*3*2+1/4*1 = 9/4。
衡因子从1增加至2,需要先进行逆时针旋转,再顺 时针旋转。 (以插入的结点C为旋转轴)
A B C B C A
2、LR 情况:(LR:表示新插入结点在危机结点的 左子树的右子树上) 情况A:
+2 -1 0 +1
危机结点
0
A
0 0
C
-1
B
+1 h-1
AR
h-1
LR 改组
h-1
B
BL
h-1
A
CL CR
h-2
A B C A
右单旋转 (RotateRight )
A
-1
A C B -1
-2
0
B
0
B D
h
0
C
E h h
(a)
D
h + 1
E h h
(b)
D h E + 1 h (c)
A
C
h
在左子树D上插入新结点使其高度增1,导致结点A的 平衡因子增到 -2,造成了不平衡。 为使树恢复平衡,从A沿插入路径连续取3个结点A、B 和D,它们处于一条方向为“/”的直线上,需要做右 单旋转。 以结点B为旋转轴,将结点A顺时针旋转。
图(e) : ASLsucc = 0.5*1+ q0=0.15 if 0.1*3+0.05*2 = 0.9; q3=0.05 p2=0.1 ASLunsucc = 0.15*1+ 0.1*3+0.05*3+0.05*2 = q1=0.1 q2=0.05 0.7; (e)

do p1=0.5 to p3=0.05
Double Rotations
Fig. 28-7 (ctd.) (c) after a left rotation; (d) after a right rotation.
4)RL平衡旋转: 若在A的右子树的左子树上插入结点,使A的平衡因子
从-1增加至-2,需要先进行顺时针旋转,再逆时针旋 转。 (以插入的结点C为旋转轴)
do p1=0.5 q0= if p2=0.1 0.15 to q1=0.1 p3=0.05
to p3=0.05 do p1=0.5 q0=0.15 q1=0.1
q3=0.05 if p2=0.1
q2=0.05
q3=0.05
(c)
(d)
q2=0.05
图(c): ASLsucc = 0.5*1+0.1*2+0.05*3 = 0.85, ASLunsucc = 0.15*1+0.1*2+0.05*3+0.05*3 = 0.75. 图(d) : ASLsucc = 0.5*2+0.1*3+0.05*1 = 1.35, ASLunsucc = 0.15*2+0.1*3+0.05*3+0.05*1 = 0.8.
A B C
A C
B B
这种调整规则可以保证二叉排序树的次序不变
综上所述, 在一个平衡二叉排序树上插入一个新 结点S时,主要包括以下三步: (1)查找应插位臵,同时记录离插入位臵最近的可能
失衡结点A(A的平衡因子不等于0)。
(2)插入新结点S, 并修改从A到S路径上各结点的平
衡因子。
(3)根据A、 B的平衡因子, 判断是否失衡以及失衡 类型, 并做相应处理。

左改组(新插入结点出现在危机结点的左子树上进行的调整)
的情况分析:
1、LL 情况:(LL:表示新插入结点在危机结点的 左子树的左子树上)
+2 +1 0 +1
危机结点
0
A
B
0
B
AR
h-1
LL 改组
h
A
BL BR
h-1
h
h-1
BL
BR
h-1
AR
h-1
改组前:高度为 h + 1 中序序列: BL
改组后:高度为 h + 1
1 2 3 2 1 3 1 2 3 1
3
2
3
2
1




同样 3 个数据{ 1, 2, 3 },输入顺序不同,建立 起来的二叉搜索树的形态也不同。这直接影响 到二叉搜索树的搜索性能。 如果输入序列选得不好,会建立起一棵单支树, 使得二叉搜索树的高度达到最大。 用树的搜索效率来评价这些二叉搜索树。 为此,在二叉搜索树中加入外结点,形成判定 树。外结点表示失败结点,内结点表示搜索树 中已有的数据。 这样的判定树即为扩充的二叉搜索树。
图(e): ASLsucc = 1/3*1+1/3*3+1/3*2 = 6/3,
ASLunsucc = 1/4*1+1/4*3*2+1/4*2 =
9/4。

图(b)的情形所得的平均搜索长度最小。
(2) 不相等搜索概率的情形


设二叉搜索树中所有内、外部结点的搜索概率 互不相等。 p[1] = 0.5, p[2] = 0.1, p[3] = 0.05 q[0] = 0.15, q[1] = 0.1, q[2] = 0.05, q[3] = 0.05 分别计算各个可能的扩充二叉搜索树的搜索性 能,判断哪些扩充二叉搜索树的平均搜索长度 最小。
to
p3
q1
q2
q3
(a)
(b)
do p1 if q0 p2 to q1 p3
p1 q0
p3 do
to q3 if p2
q2
q3
q0
(c)
do p1 to p3 p2 if q3
q1
q2
(d)
判定树
q1
q2
(e)


在判定树中 ○表示内部结点,包含了关键码集合中的 某一个关键码; □表示外部结点,代表各关键码间隔中的 不在关键码集合中的关键码。 在每两个外部结点间必存在一个内部结点。 一棵判定树上的搜索成功的平均搜索长度 ASLsucc可以定义为该树所有内部结点上的搜 索概率p[i]与搜索该结点时所需的关键码比较 次数c[i] (= l[i], 即结点所在层次) 乘积之和:
例:平衡二叉树
40 24 28 45 60 40
53
70
24
28
53 70 60
引入平衡二叉树的目的是为了提高查找效率, 使
其平均查找长度为O(log2n)。
为了方便起见,给每个结点附加一个数字,给出该 结点左子树与右子树的高度差。这个数字称为结点的 平衡因子。 根据平衡二叉树的定义, 平衡二叉树上所有结点 的平衡因子只能是-1、 0,或1。当我们在一个平衡二 叉排序树上插入一个结点时,有可能导致失衡,即出 现绝对值大于1的平衡因子,如2、-2。
成失衡,此时必须重新调整树的结构,使之恢复平衡。 我们称调整平衡过程为平衡旋转。 平衡旋转可以归纳为四类:

LL平衡旋转


RR平衡旋转
LR平衡旋转

RL平衡旋转
现分别介绍这四种平衡旋转。
1)LL平衡旋转:
若在A的左子树的左子树上插入结点,使A的平
衡因子从1增加至2,需要进行一次顺时针旋转。 (以B为旋转轴)

举例说明。已知关键码集合 {a1, a2, a3} = {do, if, to},对应搜索概率p1, p2, p3, 在各搜索不成功 间隔内搜索概率分别为q0, q1, q2, q3。可能的二 叉搜索树如下所示。
p3 if to q3 q2 q1 q0 if p2 p1
p2 do p1 q0
do
相关文档
最新文档