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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

本文(二叉排序树及平衡二叉树.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

二叉排序树及平衡二叉树.docx

1、二叉排序树及平衡二叉树编 号: 学 号: 课 程 设 计教 学 院计算机学院课程名称数据结构及算法设计B题 目二叉排序树及平衡二叉排序树专 业计算机科学及技术班 级姓 名甘全中同组人员 指导教师 2016年12月26日 一 概述1。1课程设计的目的1理解和掌握该课程中的有关基本概念,程序设计思想和方法.2培养综合运用所学知识独立完成课题的能力.3培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。4掌握从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力.5. 本课程是数据结构课程的

2、实践环节。主要目的在于加强学生在课程中学习的相关算法和这些方法的具体应用,使学生进一步掌握在C或其他语言中应用这些算法的能力。通过课程设计题目的练习,强化学生对所学知识的掌握及对问题分析和任务定义的理解.另外,数据结构是计算机科学及技术专业的一门核心专业基础课程,在该专业的课程体系中起着承上启下的作用,学好数据结构对于提高理论认知水平和实践能力有着极为重要的作用.学习数据结构的最终目的是为了获得求解问题的能力。对于现实世界中的问题,应该能从中抽象出一个适当的数学模型,该数学模型在计算机内部用相应的数据结构来表示,然后设计一个解此数学模型的算法,再进行编程调试,最后获得问题的解答。1。2课程设计

3、的要求用二叉链表作存储结构,编写程序实现二叉排序树上的基本操作:以回车(n)为输入结束标志,输入数列L,生成二叉排序树T;对二叉排序树T作中序遍历;计算二叉排序树T的平均查找长度,输出结果;输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历;否则输出信息“无结点x”;判断二叉排序树T是否为平衡二叉排序树;再用数列L,生成平衡二叉排序树BT:对平衡二叉树作中序遍历输出;当插入新元素之后,发现当前的二叉排序树BT不是平衡二叉排序树,则立即将它转换成新的平衡二叉排序树BT;当删除元素之后,发现当前的二叉排序树BT不是平衡二叉排序树,则立即将它转换成新的平衡二叉排序树BT;计算

4、平衡的二叉排序树BT的平均查找长度,输出结果。二 总体方案设计用二叉链表作存储结构实现二叉排序树:(1)以回车(0)为输入结束标志,输入数列L,生成一棵二叉排序树T;(2)对二叉排序树T作中序遍历,输出结果;(3)求二叉排序树的平均查找长度;(4)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”。(5)判断二叉排序树是不是平衡二叉树;(6)以回车(0)为输入结束标志,输入数列L,生成一棵平衡二叉树T;(7)对平衡二叉树T作中序遍历,输出结果;(8)在平衡二叉树中插入新元素,并作中序输出;(9)在平衡二叉树中删除元素,并作中序输出;(

5、10)求平衡二叉树的平均查找长度;2。1二叉排序树的建立 二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree)。其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树: 若它的左子树非空,则左子树上所有结点的值均小于根结点的值; 若它的右子树非空,则右子树上所有结点的值均大于根结点的值; 左、右子树本身又各是一棵二叉排序树。建二叉树的结点至少应当包含三个域,分别存放结点的数据data,左子女结点指针leftChild和右子女结点指针rightChild.整个二叉树的链表要有一个表头指针,它指向二叉树的根结点,其作用是当作树的访问点从空

6、的二叉排序树开始,经过一系列的查找插入操作以后,生成了一棵二叉排序树。根据二叉排序树的定义,建立一棵二叉排序树的过程是按照待排序序列元素的先后次序,不断动态生成二叉树的结点,逐个插入到二叉树中。若p为根结点指针,b为当前待插入元素,其过程可以描述为:若为空树(p=nil),动态生成一个结点,其数据域为当前待插入元素b,左、右指针域为“空”,p指向该结点。若非空树,比较b及根结点数据data(p)如果bdata(p), 将b插入左子树中;如果bdata(p),将b插入右子树中;左、右子树的插入方式及二叉排序树的插入方式相同。不断调用上述的插入过程,直到所有待排序序列均排入后,就形成一棵二叉排序树

7、.由此可见,建立二叉排序树就是多次调用二叉排序树的插入算法(递归调用)。2.2二叉排序树的中序遍历中序遍历二叉树算法的框架是:若二叉树为空,则空操作;否则中序遍历左子树(L);访问根结点(V);中序遍历右子树(R)。中序遍历二叉树也采用递归函数的方式,先访问左子树,然后访问根结点,最后访问右子树。直至所有的结点都被访问完毕。2。3二叉排序树中元素的查找在二叉排序树上进行查找,是一个从根结点开始,沿某一个分支逐层向下进行比较判等的过程.它可以是一个递归的过程.假设我们想要在二叉排序树中查找关键码为x的元素,查找过程从根结点开始。如果根指针为NULL,则查找不成功;否则用给定值x及根结点的关键码进

8、行比较;如果给定值等于根结点的关键码,则查找成功,返回查找成功的信息,并报告查找到的结点地址.如果给定值小于根结点的关键码,则继续递归查找根结点的左子树;否则,递归搜索根结点的右子树.2.4二叉排序树中元素的删除对于二叉排序树,删去树上的一个结点相当于删去有序序列中的一个记录,只要在删除某个结点之后依旧保持二叉排序树的特性即可。假设在二叉排序树上被删除结点为p(指向结点的指针是p),其双亲结点为f(结点指针为f),且不失一般性,可设p是f的左孩子,1。若p结点为叶子结点,即p和l均为空,只需修改其双亲结点指针即可。2。若*p结点只有左子树或者只有右子树,只要令左子树或右子树直接成为其双亲结点即

9、可.3。若左子树和右子树都不为空,令*p的直接前驱替代*p,然后从二叉排序树中删除它的直接前驱,即可。2。5二叉排序树的平均查找长度计算二叉排序树的平均查找长度时,采用类似中序遍历的递归方式,用s记录总查找长度,j记录每个结点的查找长度,s置初值为0,采用累加的方式最终得到总查找长度s.平均查找长度就等于s/i(i为树中结点的总个数)。假设在含有n(n=1)个关键字的序列中,i个关键字小于第一个关键字,ni1个关键字大于第一个关键字,则由此构造而得的二叉排序树在n个记录的查找概率相等的情况下,其平均查找长度为: ASL(n,i)=1+i*(P(i)+1)+(ni1)(P(n-i-1)+1)/n

10、其中P(i)为含有i个结点的二叉排序树的平均查找长度,则P(i)+1为查找左子树中每个关键字时所用比较次数的平均值,P(ni-1)+1为查找右子树中每个关键字时所用比较次数的平均值。又假设表中n个关键字的排列是“随机”的,即任一个关键字在序列中将是第1个,或第2个,,或第n个的概率相同,则可对上式从i等于0至n-1取平均值。最终会推导出: 当n=2时,ASL(n)=2(11/n)ln(n)由此可见,在随机的情况下,二叉排序树的平均查找长度和log(n)是等数量级的。2.6平衡二叉树(AVL) 若 T 是一棵非空二叉树,其左、右子树分别为 TL 和 TR ,令 hl 和 hr 分别为左、右子树的

11、深度。当且仅当TL 、 TR 都是平衡二叉树; hl hr 1;时,则 T 是平衡二叉树. 构造平衡二叉排序树的过程中,每当插入一个结点时,首先检查是否因插入而破坏了树的平衡性,如果是因插入结点而破坏了树的平衡性,则找出其中最小不平衡子树,在保持排序树特性的前提下,调整最小不平衡子树中各结点之间的连接关系,以达到新的平衡.最小不平衡子树:以离插入结点最近、且平衡因子绝对值大于 1 的结点作根结点的子树.假设二叉排序树的最小不平衡子树的根结点为 A ,则调整该子树的规律可归纳为下列四种情况: (1)LL 型:新结点 X 插在 A 的左孩子的左子树里。调整方法见上图。图中以 B 为轴心,将 A 结

12、点从 B 的右上方转到 B 的右下侧,使 A 成为 B 的右孩子。(2)RR 型:新结点 X 插在 A 的右孩子的右子树里。调整方法见上图。图中以 B 为轴心,将 A 结点从 B 的左上方转到 B 的左下侧,使 A 成为 B 的左孩子。(3)LR 型:新结点 X 插在 A 的左孩子的右子树里。调整方法见图 .分为两步进行:第一步以 X 为轴心,将 B 从 X 的左上方转到 X 的左下侧,使 B 成为 X 的左孩子, X 成为 A 的左孩子。第二步跟 LL 型一样处理 ( 应以 X 为轴心 ) 。(4)RL 型:新结点 X 插在 A 的右孩子的左子树里。调整方法见上图。分为两步进行:第一步以 X

13、 为轴心,将 B 从 X 的右上方转到 X 的右下侧,使 B 成为 X 的右孩子, X 成为 A 的右孩子。第二步跟 RR 型一样处理 ( 应以 X 为轴心 ) 。2.7中序输出平衡二叉树 右遍历的定义可知,中序遍历二叉树的递规算法可以定义为:若二叉树为空,则空操作;否则中序遍历左子树,访问根结点,中序遍历右子树。2.8在平衡二叉排序树上插入一个新元素1.若BBST为空树,则插入一个数据元素为e的新结点作为BBST的根结点,树的深度增加1;2.若e的关键字和BBST的根结点的关键字相等,则不进行插入;3.若e的关键字小于BBST的根结点的关键字,而且在BBST的左子树中不存在和e有相同关键字的

14、结点,则将e插入在BBST的左子树上。4。若e的关键字大于BBST的根结点的关键字,而且在BBST的右子树中不存在和e相同关键字的结点,则将e插入在BBST的右子树上2。9在平衡二叉排序树上删除一个元素 删除结点过程及插入结点的操作类似,基本过程是:平衡二叉树- 找到要删除的结点- 删除一个结点 变成二叉树 旋转 变回平衡二叉树。具体过程将详细设计中的代码。2.10求平衡二叉树的平均查找长度计算平衡二叉排序树的平均查找长度时,采用类似中序遍历的递归方式,用s记录总查找长度,j记录每个结点的查找长度,s置初值为0,采用累加的方式最终得到总查找长度s。平均查找长度就等于s/i(i为树中结点的总个数

15、)。A.使用的头文件include include B.常量定义# define LH +1 /左高 define EH 0 /等高 define RH 1 /右高# define TRUE 1 define FALSE 0 define EQ(a,b) ((a)=(b))# define LT(a,b) ((a)(b) define LQ(a,b) ((a)bf = 0; /结点初始值为0 Node-leftchild = NULL; Node-rightchild = NULL; return Node;3。2功能设计:插入新元素之后,保证仍为平衡二叉树 原型函数:BSTree Inser

16、tAVL(BSTree T, int e)函数功能及思想说明:在平衡的二叉排序BBST上插入一个新的数据元素e的递归算法可描述如下:(1)若BBST为空树,则插入一个数据元素为e的新结点作为BBST的根结点,树的深度增加1;(2)若e的关键字和BBST的根结点的关键字相等,则不进行插入;(3)若e的关键字小于BBST的根结点的关键字,而且在BBST的左子树中不存在和e有相同关键字的结点,则将e插入在BBST的左子树上,并且当插入之后的左子树深度增加(+1),分别就下列不同情况处理之:BBST的根结点的平衡因子为-1(右子树的深度大于左子树的深度):则将根结点的平衡因子更改为0,BBST的深度不

17、变;BBST的根结点的平衡因子为0(左、右子树的深度相等):则将根结点的平衡因子更改为1,BBST的深度增加1;BBST的根结点的平衡因子为1(左子树的深度大于右子树的深度):若BBST的左子树根结点的平衡因子为1,则需进行单向右旋转平衡处理,并且在右旋转处理之后,将根结点和其右子树根结点的平衡因子更改为0,树的深度不变;若BBST的左子树根结点的平衡因子为1,则需进行先向左、后向右的双向旋转平衡处理,并且在旋转处理之后,修改根结点和其左、右子树根结点的平衡因子,树的深度不变;(4)若e的关键字大于BBST的根结点的关键字,而且在BBST的右子树中不存在和e有相同关键字的结点,则将e插入在BB

18、ST的右子树上,并且当插之后的右子树深度增加(+1)时,分别就不同的情况处理之.4种插入中,(1)和(3)对称,(2)和(4)对称.旋转操作的正确性容易由“保持二叉排序树的特性:中序遍历所得关键字序列自小到大有序”证明之。当平衡二叉树因插入或者删除结点而失去平衡时,仅需对最小不平衡子树进行平衡旋转处理即可。因为经过旋转处理之后的子树深度和插入或删除之前相同,因而不影响插入或删除路径上所有祖先结点的平衡.主要部分的详细流程图(右平衡):以指针T所指结点为根的二叉树作右平衡旋转处理 bf=RH 函数源代码:/对以p为根的树作右旋处理,处理之p指向新的树根结点即旋转处理之前的左子树根结点BSTree

19、 R_Rotate(BSTree p) BSTNode lc; /声明BSTNode* 临时变量 lc=p-leftchild; /lc指向的*p的左子树根结点 p-leftchild=lc-rightchild; /lc的右子树挂接为p的左子树 lcrightchild=p; p=lc; /p指向新的根结点 return p; /返回新的根结点/对以p为根的树作左旋处理,处理之p指向新的树根结点即旋转处理之前的右子树根结点BSTree L_Rotate(BSTree p) BSTNode *rc; /声明BSTNode 临时变量 rc=prightchild; /rc指向的p的右子树根结点

20、prightchild=rcleftchild; /rc的左子树挂接为*p的右子树 rc-leftchild=p; p=rc; /p指向新的根结点 return p; /返回新的根结点/对以指针T所指结点为根的二叉树作左平衡旋转处理,本算法结束时指针T指向新的根结点BSTree LeftBalance(BSTree T) BSTNode *lc,rd; lc=T-leftchild; /lc指向T的左子树根结点 switch(lc-bf) /检查T的左子树平衡度,并做相应的平衡处理 case LH: /新结点插入在T的左孩子的左子树上,要做单右旋处理 Tbf=lc-bf=EH; T=R_Rot

21、ate(T); break; case RH: /新结点插入在*T的左孩子的右子树上,要做双旋处理 rd=lc-rightchild; /rd指向T的左孩子的右子树根 switch(rdbf) /修改T及其左孩子的平衡因子 case LH: T-bf=RH; lc-bf=EH; break; case EH: T-bf=lcbf=EH; break; case RH: Tbf=EH; lc-bf=LH; break; rdbf=EH; Tleftchild=L_Rotate(T-leftchild); /对*T的左孩子做左旋平衡处理 T=R_Rotate(T); /对*T做右旋处理 retur

22、n T;/对以指针T所指结点为根的二叉树作右平衡旋转处理,本算法结束时指针T指向新的根结点BSTree RightBalance(BSTree T) BSTree rc,ld; rc=T-rightchild; /rc指向*T的右子树根结点 switch(rc-bf) /检查T的右子树平衡度,并做相应的平衡处理 case RH: /新结点插入在T的右孩子的右子树上,要做单右旋处理 Tbf=rcbf=EH; T=L_Rotate(T); break; case LH: /新结点插入在T的右孩子的左子树上,要做双旋处理 ld=rcleftchild; /ld指向*T的右孩子的左子树根 switch

23、(ld-bf) /修改T及其右孩子的平衡因子 case LH: T-bf=LH; rc-bf=EH; break; case EH: T-bf=rc-bf=EH; break; case RH: Tbf=EH; rcbf=RH; break; ldbf=EH; T-rightchild=R_Rotate(T-rightchild); /对T的右孩子做右旋平衡处理 T=L_Rotate(T); /对T做左旋处理 return T;/若在平衡的二叉排序树T中不存在和e有相同关键字的结点,则插入一个数据元素为e的新结点,/并返回插入后所建成的平衡二叉排序树,否则返回NULL./若因插入而使二叉数失去

24、平衡,则作平衡旋转处理,布尔变量taller反映T长高及否BSTree InsertAVL(BSTree T, int e) BSTree p;/插入新结点,树长高置taller为TRUEif(!T) T=(BSTree)malloc(sizeof(BSTNode)); Tdata=e; T-leftchild=T-rightchild=NULL; T-bf=EH; /此时平衡因子为0,EH等高. taller=TRUE; /树的深度增加else /树中存在和e有相同关键字的结点则不再插入 if(e=Tdata) taller=FALSE; return NULL; /值小于则继续在树的左子树中搜索 if(e T-data) p=Insert

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1