ImageVerifierCode 换一换
格式:PPT , 页数:150 ,大小:3.05MB ,
资源ID:1242028      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-1242028.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(9 数据结构.ppt)为本站会员(kuailexingkong)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

9 数据结构.ppt

1、9.0 基本概念9.1 静态查找表9.2 动态查找表9.3 哈希表,第九章 查找,教材第8、11和12章省略,因操作系统课程会涉及。,9.0 基本概念,若表中存在特定元素,称查找成功,应输出该记录;否则,称查找不成功(也应输出失败标志或失败位置),查找表查 找查找成功查找不成功静态查找动态查找关键字主关键字次关键字,由同一类型的数据元素(或记录)构成的集合。,查询(Searching)特定元素是否在表中。,只查找,不改变集合内的数据元素。既查找,又改变(增减)集合内的数据元素。记录中某个数据项的值,可用来识别一个记录 ( 预先确定的记录的某种标志 ) 可以唯一标识一个记录的关键字,例如“学号”

2、,例如“女”,是一种数据结构,识别若干记录的关键字,(2)对查找表常用的操作有哪些? 查询某个“特定的”数据元素是否在表中;查询某个“特定的”数据元素的各种属性;在查找表中插入一元素;从查找表中删除一元素。,(3) 有哪些查找方法? 查找方法取决于表中数据的排列方式;,讨论:,(1)查找的过程是怎样的? 给定一个值K,在含有n个记录的文件中进行搜索,寻找一个关键字值等于K的记录,如找到则输出该记录,否则输出查找不成功的信息。,例如查字典,针对静态查找表和动态查找表的查找方法也有所不同。,“特定的”=关键字,明确:查找的过程就是将给定的K值与文件中各记录的关键字项进行比较的过程。所以用比较次数的

3、平均值来评估算法的优劣。称为平均查找长度(ASL:average search length)。,其中:n是文件记录个数;Pi是查找第i个记录的查找概率(通常取等概率,即Pi =1/n);Ci是找到第i个记录时所经历的比较次数。,统计意义上的数学期望值,物理意义:假设每一元素被查找的概率相同,则查找每一元素所需的比较次数之总和再取平均,即为ASL。,显然,ASL值越小,时间效率越高。,(4)如何评估查找方法的优劣?,针对静态查找表的查找算法主要有:,9.1 静态查找表,静态查找表的抽象数据类型参见教材P216。,一、顺序查找(线性查找)二、折半查找(二分或对分查找)三、静态树表的查找四、分块查

4、找(索引顺序查找),一、顺序查找( Linear search,又称线性查找 ),(1)顺序表的机内存储结构:,typedef struct ElemType *elem; /表基址,0号单元留空。表容量为全部元素 int length; /表长,即表中数据元素个数SSTable;,顺序查找:即用逐一比较的办法顺序查找关键字,这显然是最直接的办法。 对顺序结构如何线性查找?见下页之例或教材P216;对单链表结构如何线性查找?函数虽未给出,但也很容易编写;只要知道头指针head就可以“顺藤摸瓜”;对非线性树结构如何顺序查找?可借助各种遍历操作!,顺序查找演示,(2)算法的实现:,技巧:把待查关键

5、字key存入表头或表尾(俗称“哨兵”),这样可以加快执行速度。,例:,若将待查找的特定值key存入顺序表的首部(如0号单元),则顺序查找的实现方案为:从后向前逐个比较!,int Search_Seq( SSTable ST , KeyType key ) /在顺序表ST中,查找关键字与key相同的元素;若成功,返回其位置信息,否则返回0 ST.elem0.key =key; /设立哨兵,可免去查找过程中每一步都要检测是否查找完毕。当n1000时,查找时间将减少一半。 for( i=ST.length; ST.elem i .key!=key; - - i ); /不要用for(i=n; i0;

6、 - -i) 或 for(i=1; i x,把查找区间缩小 到表的前半部分,继续折半查找; Elementmid.key x,把查找区间缩小到表的后半部分,继续折半查找。如果查找区间已缩小到一个对象,仍未找到想要查找的对象,则查找失败,如何改进?,讨论 顺序查找的特点:,对顺序表结构如何编程实现折半查找算法? 见下页之例,或见教材(P219)对单链表结构如何折半查找? 无法实现!因全部元素的定位只能从头指针head开始对非线性(树)结构如何折半查找? 可借助二叉排序树来查找(属动态查找表形式)。, 运算步骤:(1) low =1,high =11 ,mid =6 ,待查范围是 1,11;(2)

7、 若 ST.elemmid.key key,说明keylow ,mid-1, 则令:high =mid1;重算 mid ;(4)若 ST.elem mid .key = key,说明查找成功,元素序号=mid;结束条件: (1)查找成功 : ST.elemmid.key = key (2)查找不成功 :highlow (意即区间长度小于0),解: 先设定3个辅助标志: low,high,mid,,折半查找举例:,Low指向待查元素所在区间的下界,high指向待查元素所在区间的上界,mid指向待查元素所在区间的中间位置,已知如下11个元素的有序表:(05 13 19 21 37 56 64 75

8、 80 88 92), 请查找关键字为21 和85的数据元素。,显然有:mid= (low+high)/2,二分查找演示,折半查找,(a)查找 k = 21的过程,折半查找,(b)查找 k = 85的过程,查找成功的例子,-1 0 1 3 4 6 8 10 12,6,0 1 2 3 4 5 6 7 8,查找,low,mid,high,6,6 8 10 12,5 6 7 8,low,mid,high,6,6,5,low,mid,high,6,搜索失败的例子,-1 0 1 3 4 6 8 10 12,5,0 1 2 3 4 5 6 7 8,搜索,low,mid,high,5,6 8 10 12,5

9、 6 7 8,low,mid,high,6,5,5,low,mid,high,5,讨论 若关键字不在表中,怎样得知和停止?,典型标志是:当查找范围的上界下界时停止查找。,讨论 二分查找的效率(ASL),1次比较就查找成功的元素有1个(20),即中间值;2次比较就查找成功的元素有2个(21),即1/4处(或3/4)处;3次比较就查找成功的元素有4个(22),即1/8处(或3/8)处 4次比较就查找成功的元素有8个(23),即1/16处(或3/16)处 则第m次比较时查找成功的元素会有(2m-1)个;为方便起见,假设表中全部n个元素 2m-1个,此时就不讨论第m次比较后还有剩余元素的情况了。,全部

10、比较总次数为120221322423m2m1 ,推导过程,平均每个数据的查找时间还要除以n,所以:,(详细推导过程见教材P221的附录1),课堂练习(多项选择):,采用链式存贮结构 记录的长度128 采用顺序存贮结构 记录按关键字递增有序,使用折半查找算法时,要求被查文件:,查找成功时检测指针停留在树中某个结点。查找不成功时检测指针停留在某个外结点(失败结点)。,35,15,45,50,25,10,20,30,搜索22,搜索45,有序顺序表的折半查找的判定树 ( 10, 20, 30, 40, 50, 60 ),10,50,=,=,=,=,=,=,30,20,40,60,(2*1+3*6)/7

11、,折半查找的优缺点:,优点:,1. 效率较高。,缺点:,1. 只适用于有序表;,2. 查找表必须是顺序存储结构。,三、分块查找(索引顺序查找),这是一种顺序查找的另一种改进方法。先让数据分块有序,即分成若干子表,要求每个子表中的数值(用关键字更准确)都比后一块中数值小(但子表内部未必有序)。然后将各子表中的最大关键字构成一个索引表,表中还要包含每个子表的起始地址(即头指针)。,索引表,最大关键字,起始地址,第1块,第2块,第3块,22,48,86,例:,特点:块间有序,块内无序,查找步骤分两步进行:, 对索引表使用折半查找法(因为索引表是有序表); 确定了待查关键字所在的子表后,在子表内采用顺

12、序查找法(因为各子表内部是无序表);查找效率:ASL=Lb+Lw,对索引表查找的ASL,对块内查找的ASL,S为每块内部的记录个数,n/s即块的数目,例如当n=9,s=3时,ASLbs=3.5,而折半法为3.1,顺序法为5,分块查找演示,特点:,一、二叉排序树的定义二、平衡二叉树三、B-树和B+树,9.2 动态查找表,表结构在查找过程中动态生成。,要求:,对于给定值key,若表中存在其关键字等于key的记录,则查找成功返回;否则插入关键字等于key 的记录。,典型的动态表,抽象数据类型动态查找表的定义如下:,ADT DynamicSearchTable 数据对象:D = ai | ai Ele

13、mSet, i = 1, 2, ., n, n0 数据关系: R = ,基本操作:,初始化操作,InitDSTable( &DT )操作结果:构造一个空的动态查找表 DT。,结构销毁操作,DestroyDSTable( &DT )初始条件:动态查找表 DT 存在。操作结果:销毁动态查找表 DT。,引用型操作,SearchDSTable( DT, key )初始条件:动态查找表 DT 存在,key 为和关键字类型相同的给定值;操作结果:若 DT 中存在关键字等于 key 的元素,则返回该元素的值或位置,否则返回空元素或者0。,TraverseDSTable( DT, Visit( ) )初始条件

14、:动态查找表 DT 存在,visit()是访问函数。操作结果:按某种次序对 DT 的每个元素调用函数visit( )一次,一旦visit( )失败,则操作失败。,加工型操作,InsertDSTable( &DT, e )初始条件:动态查找表 DT 存在, e 为待插入元素;操作结果:若 DT 中不存在关键字等于 e.key 的数据元素,则插入 e 。,DeleteDSTable( &T, key )初始条件:动态查找表DT存在,key 为和关键字类型相同的给定值;操作结果:若 DT 中存在其关键字等于 key 的数据元素,则删除之。, ADT DynamicSearchTable,二叉排序树(

15、二叉查找树):或者是一棵空树;或者是具有如下特性的二叉树:, 非空左子树上所有结点的值均小于根结点的值;, 左、右子树都是二叉排序树。, 非空右子树上所有结点的值均大于根结点的值;,该定义是一个递归的定义,可以用广义表的形式描述: BSTree = ( LT, root, RT )其中 root 是结点类型,LT 为左子树,RT 为右子树。,一、二叉排序树,50,30,80,20,90,10,85,40,35,25,23,88,例如:,是二叉排序树。,66,不,二叉排序树的存储结构,通常,取二叉链表作为二叉排序树的存储结构。,typedef struct BiTNode / 结点结构 TEle

16、mType data; struct BiTNode *lchild, *rchild; / 左右孩子指针 BiTNode, *BiTree;,二叉排序树的查找算法:,1)若给定值等于根结点的关键字,则查找成功;2)若给定值小于根结点的关键字,则继续在左子树上进行查找;3)若给定值大于根结点的关键字,则继续在右子树上进行查找。,否则,若二叉排序树为空,则查找不成功;,50,30,80,20,90,85,40,35,88,32,例如:,二叉排序树,查找关键字,= 50 ,50,50,35 ,50,30,40,35,50,90 ,50,80,90,95 ,从上述查找过程可见,,在查找过程中,生成了

17、一条查找路径:,从根结点出发,沿着左分支或右分支逐层向下直至关键字等于给定值的结点;,或者,从根结点出发,沿着左分支或右分支逐层向下直至指针指向空树为止。,查找成功,查找不成功,算法描述如下:,Status SearchBST (BiTree T, KeyType key, BiTree f, BiTree 否则表明查找不成功,返回 / 指针 p 指向查找路径上访问的最后一个结点, / 并返回函数值为FALSE, 指针 f 指向当前访问 / 的结点的双亲,其初始调用值为NULL / SearchBST, ,if (!T)else if ( EQ(key, T-data.key) ) else

18、if ( LT(key, T-data.key) ) else, p = f; return FALSE; / 查找不成功, p = T; return TRUE; / 查找成功,SearchBST (T-lchild, key, T, p ); / 在左子树中继续查找,SearchBST (T-rchild, key, T, p ); / 在右子树中继续查找,30,20,10,40,35,25,23,f,T,设 key = 48,f,T,f,T,22,p,f,T,f,T,T,T,T,f,f,f,p,根据动态查找表的定义,“插入”操作在查找不成功时才进行;,二叉排序树的插入算法,若二叉排序树为

19、空树,则新插入的结点为新的根结点;否则,新插入的结点必为一个新的叶子结点,其插入位置由查找过程得到。,【例】假设结点的关键字序列为(10, 18, 3, 8, 12, 2, 6, 4),依次输入结点建立二叉排序树,给出建立二叉排序树的过程示意图。,Status Insert BST(BiTree / Insert BST, ,s = (BiTree) malloc (sizeof (BiTNode); / 为新结点分配空间s-data = e; s-lchild = s-rchild = NULL;,if ( !p ) T = s; / 插入 s 为新的根结点,else if ( LT(e.k

20、ey, p-data.key) ) p-lchild = s; / 插入 *s 为 *p 的左孩子else p-rchild = s; / 插入 *s 为 *p 的右孩子,return TRUE; / 插入成功,被删除的结点是叶子;被删除的结点只有左子树或者只有右子树;被删除的结点既有左子树,也有右子树。,二叉排序树的删除算法,可分三种情况讨论:,和插入相反,删除在查找成功之后进行,并且要求在删除二叉排序树上某个结点之后,仍然保持二叉排序树的特性。,50,30,80,20,90,85,40,35,88,32,(1)被删除的结点是叶子结点,例如:,被删关键字 = 20,88,其双亲结点中相应指针

21、域的值改为“空”,50,30,80,20,90,85,40,35,88,32,(2)被删除的结点只有左子树或者只有右子树,其双亲结点的相应指针域的值改为 “指向被删除结点的左子树或右子树”。,被删关键字 = 40,80,合并删除通过复制进行删除,(3)被删除的结点既有左子树,也有右子树,合并删除,要删除的节点有两个子节点合并删除,合并删除,在合并删除后,树的高度增加,合并删除,15,10,30,20,5,40,2,6,在合并删除后,树的高度降低,复制删除,要删除的节点有两个子节点通过复制进行删除选取“替身”取代被删结点。如何选择?左子树中最大的结点或 右子树中最小的结点。,复制删除,122,2

22、50,300,110,200,99,105,330,400,450,500,将替身的数据场复制到被删结点的数据场。删除值为122的结点。,复制删除,122,250,300,110,200,99,105,330,400,450,500,被删结点,将替身的数据场复制到被删结点的数据场。删除值为122的结点。,复制删除的实现,若待删除结点有左、右子树,则找出其左子树中最大的结点来代替它(或用其右子树中最小的结点来代替它)。此时删除结点分三步进行: a)寻找待删除结点的前驱或后继结点,即寻找待删除结点左子树的最右下结点或右子树的最左下结点; b)用左子树中的最大结点来代替该结点或用右子树中的最小结点来

23、代替该结点; c)删除左子树中最大的结点或右子树中最小的结点。,Status DeleteBST (BiTree / 不存在关键字等于key的数据元素 else / DeleteBST,算法描述如下:, ,if ( EQ (key, T-data.key) ) / 找到关键字等于key的数据元素else if ( LT (key, T-data.key) ) else, Delete (T); return TRUE; ,DeleteBST ( T-lchild, key ); / 继续在左子树中进行查找,DeleteBST ( T-rchild, key ); / 继续在右子树中进行查找,v

24、oid Delete ( BiTree &p ) / 从二叉排序树中删除结点 p, / 并重接它的左子树或右子树 if (!p-rchild) else if (!p-lchild) else / Delete,其中删除操作过程如下所描述:, , , ,/ 右子树为空树则只需重接它的左子树,q = p; p = p-lchild; free(q);,p,p,q,q,p,p,/ 左子树为空树只需重接它的右子树,q = p; p = p-rchild; free(q);,p,p,q = p; s = p-lchild;while (s-rchild) q = s; s = s-rchild; /

25、s 指向被删结点的前驱,/ 左右子树均不空,p-data = s-data;if (q != p ) q-rchild = s-lchild; else q-lchild = s-lchild; / 重接*q的左子树free(s);,p,q,s,p,q,s,A,A,A,A,p-data = s-data;if (q != p ) q-rchild = s-lchild; else q-lchild = s-lchild;free(s);,查找性能的分析:,对于每一棵特定的二叉排序树,均可按照平均查找长度的定义来求它的 ASL 值,显然,由值相同的 n 个关键字,构造所得的不同形态的各棵二叉排序

26、树的平均查找长 度的值不同,甚至可能差别很大。,由关键字序列 3,1,2,5,4构造而得的二叉排序树,,由关键字序列 1,2,3,4,5构造而得的二叉排序树,,例如:,2,1,3,4,5,3,5,4,1,2,ASL =(1+2+3+4+5)/ 5 = 3,ASL =(1+2+3+2+3)/ 5 = 2.2,下面讨论平均情况:,不失一般性,假设长度为 n 的序列中有 k 个关键字小于第一个关键字,则必有 n-k-1 个关键字大于第一个关键字,由它构造的二叉排序树:,n-k-1,k,的平均查找长度是 n 和 k 的函数,P(n, k) ( 0 k n-1 )。,假设 n 个关键字可能出现的 n!

27、种排列的可能性相同,则含 n 个关键字的二叉排序树的平均查找长度:,在等概率查找的情况下,,由此,可类似于解差分方程,此递归方程有解:,二、平衡二叉树,平衡二叉树又称AVL树,它是具有如下性质的二叉树:,为了方便起见,给每个结点附加一个数字,给出该结点左子树与右子树的高度差。这个数字称为结点的平衡因子balance。这样,可以得到AVL树的其它性质:,即|左子树深度-右子树深度| 1,左、右子树是平衡二叉树;所有结点的左、右子树深度之差的绝对值 1,(a) 平衡树 (b) 不平衡树,例:判断下列二叉树是否AVL树?,任一结点的平衡因子只能取:-1、0 或 1;如果树中任意一个结点的平衡因子的绝

28、对值大于1,则这棵二叉树就失去平衡,不再是AVL树;,对于一棵有n个结点的AVL树,其高度保持在O(log2n)数量级,ASL也保持在O(log2n)量级。,1,1,-1,-1,2,1,-1,96,38,24,88,28,11,25,98,0,1,0,1,1,1,0,0,-1,-2,0,平衡二叉树的调整,若向平衡二叉树中插入一个新结点后破坏了平衡二叉树的平衡性,首先从根结点到该新插入结点的路径之逆向根结点方向找第一个失去平衡的结点,然后以该失衡结点和它相邻的刚查找过的两个结点构成调整子树(最小不平衡子树),即调整子树是指以离插入结点最近,且平衡因子绝对值大于1的结点为根结点的子树,使之成为新的

29、平衡子树。,96,38,24,88,28,11,25,98,2,如果在一棵AVL树中插入一个新结点,就有可能造成失衡,此时必须重新调整树的结构,使之恢复平衡。我们称调整平衡过程为平衡旋转。,现分别介绍这四种平衡旋转。,平衡旋转可以归纳为四类: LL平衡旋转 RR平衡旋转 LR平衡旋转 RL平衡旋转,(1) LL型调整,A,B,f,d,e,h,h,0,1,h,1,2,调整方法:单向右旋平衡,即将A的左孩子B 向右上旋转代替A成为根结点,将A结点向右下旋转成为B的右子树的根结点,而B的原右子树则作为A结点的左子树。,B,A,d,e,f,lc=p-lchild; /*lc指向B p-lchild=l

30、c-rchild; /*把B结点的右子树挂接为A的左子树lc-rchild=p; /*A结点成为B的右孩子p=lc; /*p指向新的根结点,p,p,(2)RR型调整,A,a,B,b,c,h,h,0,1,调整方法:单向左旋平衡:即将A的右孩子B向左上旋转代替A成为根结点,将A结点向左下旋转成为B的左子树的根结点,而B的原左子树则作为A结点的右子树。,B,A,c,a,b,-1,-2,lc=p-rchild; /*lc指向B*/ p-rchild=lc-lchild; /*把B结点的左子树挂接为A的右子树*/lc-lchild=p; /*A结点成为B的左孩子*/p=lc; /*p指向新的根结点*/,

31、p,p,(3)LR型调整,A,B,C,n,m,i,e,h,h1,h1,0,0,1,1,1,2,C,B,A,n,m,i,e,调整方法:先左旋转后右旋转平衡,即将A结点的左孩子(即B结点)的右子树的根结点(即C结点)向左上旋转提升到B结点的位置,然后再把该C结点向右上旋转提升到A结点的位置。,p,b,c,p-lchild=c-rchild; /*把C的右子树挂接成A的左子树*/b-rchild=c-lchild; /*把C的左子树挂接成B的右子树*/c-lchild=b; /*把B挂接成C的左子树*/c-rchild=p; /*把A挂接成C的右子树*/,(4)RL型调整,A,B,m,C,f,n,t

32、,C,A,B,m,n,t,f,h1,h,h1,调整方法:先右旋转后左旋转平衡,即先将A结点的右孩子B结点的左子树的根结点C结点向右上旋转提升到B结点的位置,然后再把该C结点向左上旋转提升到A结点的位置。,0,0,1,-1,1,-2,p-rchild=c-lchild; /*把C的左子树挂接成A的右子树*/b-lchild=c-rchild; /*把C的右子树挂接成B的左子树*/c-rchild=b; /*把B挂接成C的右子树*/c-lchild=p; /*把A挂接成C的左子树*/,p,b,c,例:请将下面序列构成一棵平衡二叉排序树: ( 13,24,37,90,53),013,-113,-12

33、4,-213,需要RR平衡旋转(绕B逆转,B为根),-124,-137,190,-237,需要RL平衡旋转(绕C先顺后逆),例如:依次插入的关键字为5, 4, 2, 8, 6, 9,5,4,2,4,2,5,8,6,6,5,8,4,2,向右旋转一次,先向右旋转再向左旋转,4,2,6,5,8,9,6,4,2,8,9,5,向左旋转一次,继续插入关键字 9,例1 输入关键字序列16,3,7,11,9,26,18,14,15,给出构造一棵AVL树的步骤。,16,0,3,1,0,7,0,1,2,属于“”型,应该进行RL调整先右旋转后左旋转平衡,RL调整后,11,7,18,3,9,16,26,14,-1,2

34、,0,1,-1,0,0,0,15,1,属于“data.key) /树中已存在和e有相同关键字的结点 taller = FALSE; return 0; /则不再输入 if (LT (e.key, T-data.key) /应继续在*T的左子树中进行搜索 if (!InsertAVL (T-lchild, e, taller) return 0; /未插入 if (taller) /已插入到*T的左子树中且左子树“长高” switch (T-bf) /检查*T的平衡度 case LH; /原本左子树比右子树高,需要做左平衡处理 LeftBalance (T); taller = FALSE; b

35、reak; case EH; /原本左、右子树等高,现因左子树增高而使树增高 T-bf = LH; taller = TRUE; break; case RH; /原本右子树比左子树高,现左、右子树等高 T-bf = EH; taller = FALSE; break; /switch (T-bf),/if else /应继续在*T的右子树中进行搜索 if (!InsertAVL (T-rchild, e, taller) return 0; /未插入 if (taller) /已插入到*T的右子树中且右子树“长高” switch (T-bf) /检查*T的平衡度 case LH; /原本左子

36、树比右子树高,现左、右子树等高 T-bf = EH; taller = FALSE; break; case EH; /原本左、右子树等高,现因右子树增高而使树增高 T-bf = RH; taller = TRUE; break; case RH; /原本右子树比左子树高,需要做右平衡处理 RightBalance (T); taller = FALSE; break; /switch (T-bf) /else /else return 1; /InsertAVL,void LeftBalance ( BSTree /rd指向*T的左孩子的右子树根,算法 9.12,switch (rd-bf) /修改*T及其左孩子的平衡因子 case LH: T-bf = RH; lc-bf = EH; break; case EH: T-bf = lc-bf = EH; break; case RH: T-bf = EH; lc-bf = LH; break; / switch (rd-bf) rd-bf = EH; L_Rotate(T-lchild); /对*T的左子树作左旋平衡处理 R_Rotate(T); /对*T的作右旋平衡处理 / switch (lc-bf) / LeftBalance,

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报