数据结构与算法分析 C++语言描述(第2版)Larry Nyhoff AVL树 PPT

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

1 27 A 1 0 10 B 0 05
2 27 A 10 B
0 05 0
10
B 27 A 0
1 2 27 A 1 10 B 0 0 51 γ 0 10 B 1 05 α 0 27 A 0 03 RR型调整操作示例 型 0 18 β 0 51 γ
1 05 α 0 0 18 β 0 03
A -1
A -2
B 0 B A 0 h+1 γ βh
B αh hβ 0 αh hγ h β -1


LL型调整操作示意图 (α)A(βBγ)= (αAβ)B(γ) 型调整操作示意图 调整规则:将A的右子女B提升为新二叉树的根;原来 的根A连同其左子树向左下旋转成为B的左子树;B的 原左子树作为A的右子树。 插入项位于最近的平衡因子为-2的祖先结点的右孩子 孩子的右子树时使用。
-1 -1 27 A 0 10 α 0 41 C 0 73 δ 0 0 41 C -1 B 0 27 51 A 0 10 α 0 30 β 0 73 δ 0 0 51 B 0
-1 -2 27 A 0 10 1 51 B α 1 41 0 73 δ 0 β C 0 30
RL型调整操作示例 型
性能分析
-1 27 A 0 51 B -1 -2 27 A 0 10 -10 51 B α 0 0 41 -1 73 γ β 0 99
-2 27 A -1 51 B 0 73
0 27 0
51 A
B 73 0
0 51 B -1 γ 0 27 73 A 0 10 α 0 41 β 0 99
LL型调整操作示例 型
C 0 B -1 γ h-1 δ h
h α
C 0
0
h-1β
RL型调整操作示意图 (α)A((βCγ)B(δ))= (αAβ)C(γBδ) 型调整操作示意图 调整规则:设C为A的右子女的左子女,将A的孙子结点C提升 为新二叉树的根,原来C的父结点B连同其右子树δ向右下旋 转成为新根C的右子树,C的原右子树γ成为B的左子树;原来 的根A连同其左子树α向左下旋转成为新根C的左子树,原来C 的左子树β成为A的右子树。 插入项位于最近的平衡因子为-2的祖先结点的右孩子的左子树 时使用。
AVL树 AVL树(平衡的二叉查找树)
或者是一棵空树 或者左右子树均为AVL树,且左右子树的深度 之差的绝对值不超过1 若定义二叉树上结点的平衡因子BF(Balance Factor) 为该结点的左子树的深度减去右子树的深度,那么 在AVL树上所有结点平衡因子只可能为-1, 0, 1 只要二叉树上有一个结点的平衡因子的绝对值大于 1,则该二叉树就是不平衡的。 对AVL树来说,它的深度和logN同数量级,因此 我们希望任何初始序列构成的二叉查找树都 是 AVL树。
1
27 A 0 51 δ
-2 27 A -1 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型调整操作示例 型
A -1 B
A -2 B h α C δ h γ h-1 h β 1 δ h γ h-1 h α β h 0 A 0 δ
最小不平衡子树: 最小不平衡子树:
指离插入结点最近,且以平衡因子绝对值大于1的结点 为根的子树。 27 -2 10 -1 18 最小 不平衡子树 0 25 1 51 41 0 插入结点 1
A 1
A 2 B
B 0 A
B 0 γh hβ h α
1
γ h h+1α hβ hβ
0
h α
γh
RR型调整操作示意图 RR型调整操作示意图 (αBβ)A(γ)= (α)B(βAγ) 调整规则∶将A的左子女B提升为新二叉树的根;原来 的根A连同其右子树γ向右下旋转成为B的右子树;B 的原右子树β作为A的左子树。 插入项位于最近的平衡因子为+2的祖先结点的左孩子 的左子树时使用。
1 1 -1 0 0 0 1 1 0 0
-1 2 1
平衡二叉树和不平衡二叉树示例
设最小不平衡子树的根为A,调整的规律可归纳 为下列四种: 1. RR型调整(单右旋); 2. LL型调整(单左旋) ; 3. LR型调整(先左后右双旋); 4. RL型调整(先右后左双旋); 上面的几种情况在经过平衡旋转处理后,以*b 或*c为根的新子树为平衡二叉树,而且它的深度和 插入之前以*a为根的子树相同。 因此,当平衡的二叉排序树因插入结点而失去 平衡时,仅需对最小不平衡子树进行旋转处理。
练习
给出依次插入结点1、2、3、4、5、6、7、 16、15后得到的AVL树。
二叉树上机
实现算法接受包含后缀表达式的字符串,并建立 表达式树 tnode<char> *buildExpTree(const string & pexp);
(将子树根的地址推到栈中,该栈的元素是tnode<char>*类型)
含有n个结点的AVL树的高度是h= O(log2n)。插入结点 的时间耗费最大为树的深度O(log2n)。 算法在查找插入结点的同时也找到最小不平衡子树。 最小不平衡子树中平衡因子的最大调整时间为最小不平衡 子树的深度。四种子树调整时间耗费为常数O( 1 ),因此 整个算法的时间复杂度为 O(log2n)。 关联容器通常采用AVL树作为存储结构。
A 1
A 2
C 0
B 0 0 h α h-1β γ h-1 C h α δ h
பைடு நூலகம்
B -1 1 C δ h
B 0
A -1
h α h β γ h-1
β h
γ h-1
δ h
LR型调整操作示意图 ((α)B(βCγ))A(δ)= (αBβ)C(γAδ) 型调整操作示意图 调整规则∶设C为A的左子女的右子女,将A的孙子结点C提升 为新二叉树的根;原C的父结点B连同其左子树α向左下旋转成 为新根C的左子树,原C的左子树β成为B的右子树;原根A连 同其右子树δ向右下旋转成为新根C的右子树,原C的右子树γ 成为A的左子树。 插入项位于最近的平衡因子为+2的祖先结点的左孩子的右子树 时使用。
使用displayTree()显示树 使用inorderOutput()遍历树,输出中缀表达式
相关文档
最新文档