数据结构与算法分析 c++语言描述(第2版)larry nyhoff avl树
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 27 A 0 10 B
2 27 A 1 10 B 0 05
0 10 B
05 27 A
0
0
10 0 03
21 27 A
10 10 B 0 51 1
05 0 18 0 03
0 10 B 05 0 27 A
0 18 0 51
RR型调整操作示例
A
A
B
-1
-2
0
B
B
αh
0
αh
-1
A
0
h+1 γ
➢ 对AVL树来说,它的深度和logN同数量级,因此 我们希望任何初始序列构成的二叉查找树都 是 AVL树。
1
1
1
-1 0 0
0
-1
1
2
0
1
0
平衡二叉树和不平衡二叉树示例
设最小不平衡子树的根为A,调整的规律可归纳 为下列四种:
1. RR型调整(单右旋); 2. LL型调整(单左旋) ; 3. LR型调整(先左后右双旋); 4. RL型调整(先右后左双旋); 上面的几种情况在经过平衡旋转处理后,以*b 或*c为根的新子树为平衡二叉树,而且它的深度和 插入之前以*a为根的子树相同。 因此,当平衡的二叉排序树因插入结点而失去 平衡时,仅需对最小不平衡子树进行旋转处理。
二叉树上机
实现算法接受包含后缀表达式的字符串,并建立 表达式树 tnode<char> *buildExpTree(const string & pexp);
(将子树根的地址推到栈中,该栈的元素是tnode<char>*类型)
使用displayTree()显示树
使用inorderOutput()遍历树,输出中缀表达式
--11 27 A
0 10
00 51 B
0 41 C 00 73
0 41 C
--21 27 A
0 10
10 51 B
1 41 00 73
0
30
C
0 27 A -1 51 B 0 10 0 30 0 73
RL型调整操作示例
性能分析
含有n个结点的AVL树的高度是h= O(log2n)。插入结点 的时间耗费最大为树的深度O(log2n)。
最小不平衡子树:
指离插入结点最近,且以平衡因子绝对值大于1的结点 为根的子树。
27 1 -2
10
51 1
-1 18 最小 不平衡子树 0 25
41 0 插入结点
A
A
B
1
2
0
B
B
A
0
γh
1
γ h h+1α
0
hα
hβ
hα
hβ
hβ
γh
RR型调整操作示意图 (αBβ)A(γ)= (α)B(βAγ) 调整规则∶将A的左子女B提升为新二叉树的根;原来 的根A连同其右子树γ向右下旋转成为B的右子树;B 的原右子树β作为A的左子树。 插入项位于最近的平衡因子为+2的祖先结点的左孩子 的左子树时使用。
h-1β γ h-1
h β γ h-1
LR型调整操作示意图 ((α)B(βCγ))A(δ)= (αBβ)C(γAδ) 调整规则∶设C为A的左子女的右子女,将A的孙子结点C提升为 新二叉树的根;原C的父结点B连同其左子树α向左下旋转成为 新根C的左子树,原C的左子树β成为B的右子树;原根A连同其 右子树δ向右下旋转成为新根C的右子树,原C的右子树γ成为A 的左子树。 插入项位于最近的平衡因子为+2的祖先结点的左孩子的右子树 时使用。
百度文库
C1 1
δh
A 0δ
hα βh
B -1
γ h-1 δ h
h β γ h-1
RL型调整操作示意图 (α)A((βCγ)B(δ))= (αAβ)C(γBδ) 调整规则:设C为A的右子女的左子女,将A的孙子结点C提升 为新二叉树的根,原来C的父结点B连同其右子树δ向右下旋转 成为新根C的右子树,C的原右子树γ成为B的左子树;原来的 根A连同其左子树α向左下旋转成为新根C的左子树,原来C的 左子树β成为A的右子树。 插入项位于最近的平衡因子为-2的祖先结点的右孩子的左子树 时使用。
算法在查找插入结点的同时也找到最小不平衡子树。 最小不平衡子树中平衡因子的最大调整时间为最小不平衡 子树的深度。四种子树调整时间耗费为常数O( 1 ),因此 整个算法的时间复杂度为 O(log2n)。
关联容器通常采用AVL树作为存储结构。
练习
给出依次插入结点1、2、3、4、5、6、7、 16、15后得到的AVL树。
hβ
hγ
hβ
hγ hα
βh
LL型调整操作示意图 (α)A(βBγ)= (αAβ)B(γ) 调整规则:将A的右子女B提升为新二叉树的根;原来 的根A连同其左子树向左下旋转成为B的左子树;B的 原左子树作为A的右子树。 插入项位于最近的平衡因子为-2的祖先结点的右孩子 孩子的右子树时使用。
-1 27 A
1 27 A 0 10 B 0 51
-2 27 A -1 10 B 0 51
0 05 0 18 C
0 05 1 18 C
0 18 C
0 16
0 10 B -1 27 A 0 05 0 16 0 51
LR型调整操作示例
A -1
hα
B 0
C 0
δh
h-1β γ h-1
A
C
-2
0
hα
B 0
-2 27 A
0 51 B
0 51 B
-1 51 B
27 A 73
--21 27 A
0 73
0
0
0 10
-10 51 B
0 41 -10 73
0 99
0 51 B
0 27 A -1 73 0 10 0 41 0 99
LL型调整操作示例
A
A
C
1
2
0
B 0
hα
0C
δh
B -1
hα
B
A
δh
0
-1
1C h α β h γ h-1 δ h
AVL树(平衡的二叉查找树)
➢或者是一棵空树 ➢或者左右子树均为AVL树,且左右子树的深度
之差的绝对值不超过1
➢若定义二叉树上结点的平衡因子BF(Balance Factor) 为该结点的左子树的深度减去右子树的深度,那么 在AVL树上所有结点平衡因子只可能为-1, 0, 1
➢只要二叉树上有一个结点的平衡因子的绝对值大于 1,则该二叉树就是不平衡的。