欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    数据结构与算法设计课程设计-二叉排序树与平衡二叉树(13页).docx

    • 资源ID:38945756       资源大小:301.22KB        全文页数:13页
    • 资源格式: DOCX        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    数据结构与算法设计课程设计-二叉排序树与平衡二叉树(13页).docx

    -数据结构与算法设计课程设计-二叉排序树与平衡二叉树D04710043学 号: 201540410126课 程 设 计教 学 院计算机学院课程名称数据结构与算法设计B题 目二叉排序树与平衡二叉排序树专 业计算机科学与技术班 级2015级(1)班姓 名甘全中同组人员指导教师2016年12月26日 目 录一 概述21.1课程设计的目的21.2课程设计的要求2二 总体方案设计32.1二叉排序树的建立32.2二叉排序树的中序遍历42.3二叉排序树中元素的查找42.4二叉排序树中元素的删除52.5二叉排序树的平均查找长度52.6平衡二叉树(AVL)52.7中序输出平衡二叉树72.8在平衡二叉排序树上插入一个新元素82.9在平衡二叉排序树上删除一个元素82.10求平衡二叉树的平均查找长度8三 详细设计9四 程序的调试与运行结果说明12五 课程设计总结13参考文献14一 概述1.1课程设计的目的1理解和掌握该课程中的有关基本概念,程序设计思想和方法。2培养综合运用所学知识独立完成课题的能力。3培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。4掌握从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。5. 本课程是数据结构课程的实践环节。主要目的在于加强学生在课程中学习的相关算法和这些方法的具体应用,使学生进一步掌握在C或其他语言中应用这些算法的能力。通过课程设计题目的练习,强化学生对所学知识的掌握及对问题分析和任务定义的理解。另外,数据结构是计算机科学与技术专业的一门核心专业基础课程,在该专业的课程体系中起着承上启下的作用,学好数据结构对于提高理论认知水平和实践能力有着极为重要的作用。学习数据结构的最终目的是为了获得求解问题的能力。对于现实世界中的问题,应该能从中抽象出一个适当的数学模型,该数学模型在计算机内部用相应的数据结构来表示,然后设计一个解此数学模型的算法,再进行编程调试,最后获得问题的解答。1.2课程设计的要求用二叉链表作存储结构,编写程序实现二叉排序树上的基本操作:以回车('n')为输入结束标志,输入数列L,生成二叉排序树T;对二叉排序树T作中序遍历;计算二叉排序树T的平均查找长度,输出结果;输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历;否则输出信息“无结点x”;判断二叉排序树T是否为平衡二叉排序树;再用数列L,生成平衡二叉排序树BT:对平衡二叉树作中序遍历输出;当插入新元素之后,发现当前的二叉排序树BT不是平衡二叉排序树,则立即将它转换成新的平衡二叉排序树BT;当删除元素之后,发现当前的二叉排序树BT不是平衡二叉排序树,则立即将它转换成新的平衡二叉排序树BT;计算平衡的二叉排序树BT的平均查找长度,输出结果。二 总体方案设计用二叉链表作存储结构实现二叉排序树:(1)以回车('0')为输入结束标志,输入数列L,生成一棵二叉排序树T;(2)对二叉排序树T作中序遍历,输出结果;(3)求二叉排序树的平均查找长度;(4)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”。(5)判断二叉排序树是不是平衡二叉树;(6)以回车('0')为输入结束标志,输入数列L,生成一棵平衡二叉树T;(7)对平衡二叉树T作中序遍历,输出结果;(8)在平衡二叉树中插入新元素,并作中序输出;(9)在平衡二叉树中删除元素,并作中序输出;(10)求平衡二叉树的平均查找长度;2.1二叉排序树的建立 二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree)。其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树: 若它的左子树非空,则左子树上所有结点的值均小于根结点的值; 若它的右子树非空,则右子树上所有结点的值均大于根结点的值; 左、右子树本身又各是一棵二叉排序树。建二叉树的结点至少应当包含三个域,分别存放结点的数据data,左子女结点指针leftChild和右子女结点指针rightChild。整个二叉树的链表要有一个表头指针,它指向二叉树的根结点,其作用是当作树的访问点从空的二叉排序树开始,经过一系列的查找插入操作以后,生成了一棵二叉排序树。根据二叉排序树的定义,建立一棵二叉排序树的过程是按照待排序序列元素的先后次序,不断动态生成二叉树的结点,逐个插入到二叉树中。若p为根结点指针,b为当前待插入元素,其过程可以描述为:若为空树(p=nil),动态生成一个结点,其数据域为当前待插入元素b,左、右指针域为“空”,p指向该结点。若非空树,比较b与根结点数据data(p)如果b<data(p), 将b插入左子树中;如果bdata(p),将b插入右子树中;左、右子树的插入方式与二叉排序树的插入方式相同。不断调用上述的插入过程,直到所有待排序序列均排入后,就形成一棵二叉排序树。由此可见,建立二叉排序树就是多次调用二叉排序树的插入算法(递归调用)。2.2二叉排序树的中序遍历中序遍历二叉树算法的框架是:若二叉树为空,则空操作;否则中序遍历左子树(L);访问根结点(V);中序遍历右子树(R)。中序遍历二叉树也采用递归函数的方式,先访问左子树,然后访问根结点,最后访问右子树.直至所有的结点都被访问完毕。2.3二叉排序树中元素的查找在二叉排序树上进行查找,是一个从根结点开始,沿某一个分支逐层向下进行比较判等的过程。它可以是一个递归的过程。假设我们想要在二叉排序树中查找关键码为x的元素,查找过程从根结点开始。如果根指针为NULL,则查找不成功;否则用给定值x与根结点的关键码进行比较;如果给定值等于根结点的关键码,则查找成功,返回查找成功的信息,并报告查找到的结点地址。如果给定值小于根结点的关键码,则继续递归查找根结点的左子树;否则,递归搜索根结点的右子树。2.4二叉排序树中元素的删除对于二叉排序树,删去树上的一个结点相当于删去有序序列中的一个记录,只要在删除某个结点之后依旧保持二叉排序树的特性即可。假设在二叉排序树上被删除结点为*p(指向结点的指针是p),其双亲结点为*f(结点指针为f),且不失一般性,可设*p是*f的左孩子,1.若*p结点为叶子结点,即p和l均为空,只需修改其双亲结点指针即可。2.若*p结点只有左子树或者只有右子树,只要令左子树或右子树直接成为其双亲结点即可。3.若左子树和右子树都不为空,令*p的直接前驱替代*p,然后从二叉排序树中删除它的直接前驱,即可。2.5二叉排序树的平均查找长度计算二叉排序树的平均查找长度时,采用类似中序遍历的递归方式,用s记录总查找长度,j记录每个结点的查找长度,s置初值为0,采用累加的方式最终得到总查找长度s。平均查找长度就等于s/i(i为树中结点的总个数)。假设在含有n(n>=1)个关键字的序列中,i个关键字小于第一个关键字,n-i-1个关键字大于第一个关键字,则由此构造而得的二叉排序树在n个记录的查找概率相等的情况下,其平均查找长度为: ASL(n,i)=1+i*(P(i)+1)+(n-i-1)(P(n-i-1)+1)/n其中P(i)为含有i个结点的二叉排序树的平均查找长度,则P(i)+1为查找左子树中每个关键字时所用比较次数的平均值,P(n-i-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 分别为左、右子树的深度。当且仅当TL 、 TR 都是平衡二叉树; hl hr 1;时,则 T 是平衡二叉树。 构造平衡二叉排序树的过程中,每当插入一个结点时,首先检查是否因插入而破坏了树的平衡性,如果是因插入结点而破坏了树的平衡性,则找出其中最小不平衡子树,在保持排序树特性的前提下,调整最小不平衡子树中各结点之间的连接关系,以达到新的平衡。最小不平衡子树:以离插入结点最近、且平衡因子绝对值大于 1 的结点作根结点的子树。假设二叉排序树的最小不平衡子树的根结点为 A ,则调整该子树的规律可归纳为下列四种情况:ABXXBA(1)LL 型:新结点 X 插在 A 的左孩子的左子树里。调整方法见上图。图中以 B 为轴心,将 A 结点从 B 的右上方转到 B 的右下侧,使 A 成为 B 的右孩子。ABXBAX(2)RR 型:新结点 X 插在 A 的右孩子的右子树里。调整方法见上图。图中以 B 为轴心,将 A 结点从 B 的左上方转到 B 的左下侧,使 A 成为 B 的左孩子。A(3)LR 型:新结点 X 插在 A 的左孩子的右子树里。调整方法见图 。分为两步进行:第一步以 X 为轴心,将 B 从 X 的左上方转到 X 的左下侧,使 B 成为 X 的左孩子, X 成为 A 的左孩子。第二步跟 LL 型一样处理 ( 应以 X 为轴心 ) 。(4)RL 型:新结点 X 插在 A 的右孩子的左子树里。调整方法见上图。分为两步进行:第一步以 X 为轴心,将 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有相同关键字的结点,则将e插入在BBST的左子树上。4.若e的关键字大于BBST的根结点的关键字,而且在BBST的右子树中不存在和e相同关键字的结点,则将e插入在BBST的右子树上2.9在平衡二叉排序树上删除一个元素 删除结点过程与插入结点的操作类似,基本过程是:平衡二叉树-à找到要删除的结点-à删除一个结点-à变成二叉树-à旋转-à变回平衡二叉树。具体过程将详细设计中的代码。2.10求平衡二叉树的平均查找长度计算平衡二叉排序树的平均查找长度时,采用类似中序遍历的递归方式,用s记录总查找长度,j记录每个结点的查找长度,s置初值为0,采用累加的方式最终得到总查找长度s。平均查找长度就等于s/i(i为树中结点的总个数)。三 详细设计当插入新元素之后,发现当前的二叉排序树BT不是平衡二叉排序树,则立即将它转换成新的平衡二叉排序树BT。 原型函数:BSTree InsertAVL(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的深度不变;BBST的根结点的平衡因子为0(左、右子树的深度相等):则将根结点的平衡因子更改为1,BBST的深度增加1;BBST的根结点的平衡因子为1(左子树的深度大于右子树的深度):若BBST的左子树根结点的平衡因子为1,则需进行单向右旋转平衡处理,并且在右旋转处理之后,将根结点和其右子树根结点的平衡因子更改为0,树的深度不变;若BBST的左子树根结点的平衡因子为-1,则需进行先向左、后向右的双向旋转平衡处理,并且在旋转处理之后,修改根结点和其左、右子树根结点的平衡因子,树的深度不变;(4)若e的关键字大于BBST的根结点的关键字,而且在BBST的右子树中不存在和e有相同关键字的结点,则将e插入在BBST的右子树上,并且当插之后的右子树深度增加(+1)时,分别就不同的情况处理之。主要部分的详细流程图:函数代码:/若在平衡的二叉排序树T中不存在和e有相同关键字的结点,则插入一个数据元素为e的新结点,/并返回插入后所建成的平衡二叉排序树,否则返回NULL./若因插入而使二叉数失去平衡,则作平衡旋转处理,布尔变量taller反映T长高与否BSTree InsertAVL(BSTree T, int e)BSTree p;/插入新结点,树长高置taller为TRUEif(!T)T=(BSTree)malloc(sizeof(BSTNode);T->data=e;T->leftchild=T->rightchild=NULL;T->bf=EH; /此时平衡因子为0,EH等高。taller=TRUE; /树的深度增加else/树中存在和e有相同关键字的结点则不再插入if(e=T->data)taller=FALSE;return NULL;/值小于则继续在树的左子树中搜索if(e < T->data)p=InsertAVL(T->leftchild,e); /插入到左子树且左子树长高if(p)T->leftchild=p;if(taller)switch(T->bf)/检查*T的平衡度case LH:/原本左子树比右子树高,需要做左平衡处理T=LeftBalance(T);taller=FALSE;break;case EH:/原本左、右子树同高,现因左子树争高而使树增高T->bf=LH;taller=TRUE;break;case RH:/原本右子树比左子树高,现在左右子树等高T->bf=EH;taller=FALSE;break;/继续在*T的右子树中搜索elsep=InsertAVL(T->rightchild,e);/插入到右子树且使右子树长高if (p)T->rightchild=p;if(taller)switch(T->bf)/检查*T的平衡度case LH:/原本左子树比右子树高,现在左右子树等高 T->bf=EH;taller=FALSE;break;case EH:/原本左、右子树同高,现因右子树增高而使树增高T->bf=RH;taller=TRUE;break;case RH:/原本右子树比左子树高,需要做右平衡处理T=RightBalance(T);taller=FALSE;break;return T;四 程序的调试与运行结果说明4.0运行的主菜单为: 如图4-0 主菜单输出所有功能界面 图4-04.1输入数列12、6、9、18、12、25、16生成二叉排序树: 如图4-1 输入数列生成二叉排序树 图4-14.2中序输出生成的二叉排序树: 如图4-2 将生成的二叉排序树中序输出 图4-24.3求二叉排序树的平均查找长度: 如图4-3 求生成的二叉排序树的ASL 图4-34.4判断是不是平衡二叉树: 如图4-4 通过检查平衡因子判断是不是平衡二叉树 图4-44.5删除元素6、9: 如图4-5 查找元素6、9,存在则删除并中序输出 图4-54.6删除元素6、9后判断是不是平衡元素:如图4-6 删除元素6、9后,判断二叉排序树不是平衡二叉排序树 图4-6如图4-7 删除元素6、9后,平均查找长度为 图4-74.7输入数列13、24、37、90、24、53生成平衡二叉树:如图4-8 输入数列建立平衡二叉树 图4-84.8中序输出生成的平衡二叉树: 如图4-9 中序输出生成的平衡二叉树 图4-94.9在平衡二叉树中插入元素100,并中序输出: 如图4-10 在平衡二叉树中插入数据元素中100并中序输出 图4-10 4.10在平衡二叉树中删除元素24,并中序输出: 如图4-11 在平衡二叉树中删除数据元素53并中序输出 图4-114.11求当前平衡二叉树的平均查找长度: 如图4-12 输出此时的平均查找长度ASL,输入0退出系统五 课程设计总结通过一周的课程设计,对计算机的应用,数据结构的作用以及C的使用都有了更深的了解。了解数据结构在今后学习的重要地位,包括在本学期所学习的数据库,也显示出其重要的地位。本次实验中利用的是数据结构中非线性结构树,对树的操作,基本都运用到递归函数,其逻辑性较强,某些功能函数的思想较复杂但其程序代码较简洁。二叉排序树主要运用在查找中,其构造的特殊性决定了其独有的功能。而平衡二叉树则是对二叉排序树的改进,优化其平均查找长度。理论学习和上机实践的各个环节中,通过自主学习和请教老师,我收获了不少。当然也遇到不少的问题,也正是因为这些问题引发的思考给我带来了收获。从当初不喜欢上机写程序到现在能主动写程序,从当初拿着程序不知如何下手到现在知道如何分析问题,如何用专业知识解决实际问题的转变,我发现无论是专业知识还是动手能力,自己都有很大程度的提高。通过课程设计题目的练习,强化学生对所学知识的掌握及对问题分析和任务定义的理解。在这段时间里,我遇到过的问题主要就是C语言指针有些混淆,一些用法记不太清楚。在老师的指导帮助下,同学们课余时间的讨论中,这些问题都一一得到了解决。在程序的调试能力上,无形中得到了许多的提高。例如:各头文件的使用,定义变量时出现的问题,递归函数的运用等等。在实际的上机操作过程中,不仅是让我们了解数据结构的理论知识,更重要的是培养解决实际问题的能力,所以相信通过此次实训可以提高我们分析设计能力和编程能力,为后续课程的学习及实践打下良好的基础。参考文献1 谭浩强,C程序设计题解与上机指导(第二版),北京,清华大学出版社,2000,9.2 雏凤,数据结构,大连理工大学出版社,2014,10.3 严蔚敏,吴伟明,数据结构(C语言版)M.北京:清华大学出版社,1997.4苏仕华,数据结构课程设计M.北京:机械工业出版社,2005.5杨晓光,数据结构实例教程M.北京:清华大学出版社,北京交通大学出版社,2008.6严蔚敏,吴伟明,米宁,数据结构习题集,北京:清华大学出版社,2016.4.7王红梅,数据结构(C+版)M.北京:清华大学出版社,2008.附上源代码: -第 1 页编 号:

    注意事项

    本文(数据结构与算法设计课程设计-二叉排序树与平衡二叉树(13页).docx)为本站会员(1595****071)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开