第四章树与树的表示(三)讲述介绍
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0 A
0 B
AL BL BR
BR
BL
BR
AL
BL
c
c
Aug
1 2 2 10 10
Apr
May
LL旋转
0
2 1 1 00
左单旋
0
May
0
Mar
Nov
Aug
0
Nov
Aug
0
Apr
Mar
Apr
“发现者”是Mar,“麻烦结点”Apr 在发现者左子树的左边,
因而叫 LL 插入,需要LL 旋转(左单旋)
/* AVL树类型 */
/* 结点数据 */
/* 指向左子树 */ /* 指向右子树 */
int Height;
}
/* 树高 */
int Max ( int a, int b ) { } AVLTree Insert( AVLTree T, ElementType X ) return a > b ? a : b;
JanMar Jan 1 1 2 1 020 0 0 1 1 0 0 1 1 2 1 0 Dec Dec MarMay Dec Mar
June
1 May Nov Nov 1 0 1 0 0 Nov July 0 June Oct May 0 0 June Oct 0 Sept
2 1 0
注意:有时候插入元素即便 不需要调整结构,也可能需要重新计算 一些平衡因子。
四、AVL树的插入
typedef struct AVLNode *Position;
typedef Position AVLTree;
typedef struct AVLNode{ ElementType Data; AVLTree Left; AVLTree Right;
4.5平衡二叉树
假定二叉搜索树中每个结点的查找概率都是相同的,称查找所有结 点的比较次数的平均值为树的“平均查找长度”(ASL)。
一、什么是平衡二叉树
〖例〗搜索树结点不同插入次序,将导致不同的深度和平均查找长度ASL
Jan Apr Feb Mar
July May
Sept Oct Aug Feb Jan Dec
插入
2 A 1 C
RL
1 B
旋转
0 or 1 A
0 C
AL CL
AL CR BR CL
1 or 0 B
CR
BR AL
CL
CR
BR
D
D OR D
D OR D
June
Oct
1 0
11 0 202
Sept
Apr Apr
1 1 0 00 1 1 1 0 AugAug Feb JanJuly Aug Feb 0 July 1 0 0 0 0 0 Feb Apr 1 10
只要有一个结点的平衡因子的绝对值大于1, 该二叉树就不是平衡二叉树。
三、平衡二叉树的调整
一般的二叉排序树是不平衡的,若能通过某种方法使其既保持有 序性,又具有平衡性,就找到了构造平衡二叉排序树的方法,该方法称 为平衡化旋转。 在对AVL树进行插入或删除一个结点后,通常会影响到从根结点到 插入(或删除)结点的路径上的某些结点,这些结点的子树可能发生变化。 这时就需要做“平衡化”处理,即相应的局部“旋转”调整,使得调整
0 B 1 A
LL 插入
1 B
2 A
LL 旋转
0 B
AR
BL BR BL BR
AR
0 A
BL
c c
BR
AR
2.双旋调整
1 2 00 1
Jan
0
May
0 01
左-右双旋 Nov
0 1 00
11 2 00
Mar
0
Aug
0
1 0
Aug
May
Apr Jan
Mar
LR 旋转
Apr
Jan
0
Nov
Apr
Aug Dec July
June
May
Mar June Oct
Aug
Oct Nov Sept Sept
Apr
Nov
(a) 自然月份序列
ASL(a)=(1+2×2+3×3+4×3+5 ×2+6×1)/12 = 3.5
(b) 按July, Feb, May, Mar,
Aug, Jan, Apr, Jun, Oct, Sept, Nov, Dec ASL(b)=3.0
后的树达到平衡。
1.单旋调整 2 10
Mar
1 0
May
0
Nov May
Mar
右单旋
0 0
May Nov
0
Mar
Nov
不平衡的“发现者”是Mar,“麻烦结点”Nov 在发现者右子树的右边, 因而叫 RR 插入,需要RR 旋转(右单旋)
1 A
RR
0 B
2 A
插入 AL
1 B
RR 旋转
{ /* 将X插入AVL树T中,并且返回调整后的AVL树 */
if ( !T ) { /* 若插入空树,则新建包含一个结点的树 */ T = (AVLTree)malloc(sizeof(struct AVLNode)); T->Data = X; T->Height = 0;
(c)月份字符串 大小顺序
ASL(c)= 6.5
树深在最好的情况下是O(logN),所以,二叉搜索树在最好情况下的
查找复杂度是O(logN)。
上述ASL的计算结果表明,一棵树的ASL值越小,它的结构越好, 与完全二叉树越接近,其查找时间复查度也越接近O(logN)。因此, 为了保证二叉搜索树查找的对数级时间效率,应尽可能创建枝繁叶茂的 树,而避免树枝过长、过少。
最好的结构是完美二叉树,从根到叶的各条路径都是相同的,称这
种树为完全平衡的。
二Байду номын сангаас定义
“平衡因子(Balance Factor,简称BF): BF(T) = hL-hR, 其中hL和hR分别为T的左、右子树的高度。 平衡二叉树(Balanced Binary Tree)(AVL树) ①空树,或者 ②任一结点左、右子树高度差的绝对值不超过1,即|BF(T) |≤ 1 因此,平衡二叉树上每个结点的平衡因子只可能是-1、0和1,否则,
Dec
July
2 1 0
Feb RL 旋转
Mar
10
右-左双旋
200 1
2 1101
Mar
1 00
Aug
0
May
0 0
1 0
Dec
1 0
May
0 0
Apr
1 0
Jan
July
0
Nov
0
Aug
0
Jan Feb July
Dec
Nov
Apr
Feb 一般情况调整如下: 1 RL
A 0 C 0 B
“发现者”是May,“麻烦结点”Jan在左子树的右边,
因而叫 LR 插入,需要LR 旋转 1 LR
0 B A
插入 AR
0 C
1 B
2 A 1 C
LR 旋转
0 or 1 B 0 C 1 or 0 A
AR
CR
BL
CL
CR
BL
CL
BL
CL
CR
AR
D
D OR D
D OR D
2 01 11
1 20