数据结构课程设计---二叉排序树和平衡二叉树的判别.doc_第1页
数据结构课程设计---二叉排序树和平衡二叉树的判别.doc_第2页
数据结构课程设计---二叉排序树和平衡二叉树的判别.doc_第3页
数据结构课程设计---二叉排序树和平衡二叉树的判别.doc_第4页
数据结构课程设计---二叉排序树和平衡二叉树的判别.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

武汉理工大学数据结构课程设计说明书二叉排序树和平衡二叉树的判别1引言数据结构是软件工程的一门核心专业基础课程,在我们专业的课程体系中起着承上启下的作用,学好数据结构对于提高理论认知水平和实践能力有着极为重要的作用。学习数据结构的最终目的是为了获得求解问题的能力。对于现实世界中的问题,应该能从中抽象出一个适当的数据模型,该数学模型在计算机内部用相应的数据结构来表示,然后设计一个解此数学模型的算法,在进行编程调试,最后获得问题的解答。本次课程设计的题目是对二叉排序树和平衡二叉树的扩展延伸应用。首先我们得建立一个二叉树,二叉树有顺序存储结构和链式存储结构两种存储结构,此次我选用的是二叉链表的存储结构。对于判断平衡二叉树,需要求出其每个叶子结点所在的层数,这里我采用的边遍历边求的方式,遍历采用的是先序遍历。二叉树的建立以及二叉排序树和平衡二叉树的判别中都用到了递归思想。2需求分析2.1在日常生活中,人们几乎每天都要进行“查找”工作。所谓“查找”即为在一个含有众多的数据元素(或记录)的查找表中找出某个“特定的”数据元素(或记录),即关键字。2.2本程序意为对一个已经建立的动态查找表二叉树判断其是否是二叉排序树和平衡二叉树。3数据结构设计3.1抽象数据类型二叉树的定义如下:ADT BinaryTree3.1.1数据对象D:D是具有相同特性的数据元素的集合。3.1.2数据关系R:若D=NULL,则R=NULL,称BinaryTree为空的二叉树;若D!=NULL,则R=H,H是如下的二元关系:3.1.2.1在D中存在唯一的称为根的数据元素root,它在关系H下无前驱;3.1.2.2若D-root!=NULL,则存在D-root=Dl,Dr,且Dl与Dr相交为空;3.1.2.3若Dl!=NULL,则Dl中存在唯一的元素xl,属于H,且存在Dl上的关系Hl属于H;若Dr!=NULL,则Dr中存在唯一的元素xr,属于H,且存在Dr上的关系Hr属于H;H=,Hl,Hr;3.1.2.4(Dl,Hl)是一棵符合本定义的二叉树,称为根的左子树,(Dr,Hr)是一棵符合本定义的二叉树,称为根的右子树。3.2基本操作P:InitBiTree(&T);操作结果:构造空二叉树T。CreateBiTree(&T,definition);初始条件:definition给出二叉树T的定义。操作结果:按definition构造二叉树T。ADT Tree/包含头文件#includeusing namespace std;/数据结构typedef struct Bitreeint w;struct Bitree *lchild;struct Bitree *rchild;Bitree;/定义符号常量const Max=100;/定义全局变量Bitree * root;/根结点int i;/计数/自定义函数原型说明void creat(Bitree *p);/创建二叉树void Create();void judgeBST(Bitree * root);/判断二叉排序树void judge1();void judgeAVL(Bitree * root,int count,int mark);/判断平衡/二叉树void judge2(int mark);4算法设计4.1算法内容/ Note:Your choice is C+ IDE#include using namespace std;typedef struct Bitreeint w;struct Bitree *lchild;struct Bitree *rchild;Bitree;const Max=100;Bitree *root;int i;/计数/创建二叉树void creat(Bitree *p)/按照树的先序遍历顺序输入数据,并且当结点的左右孩子不存在时输入0if(p!=0)/左孩子p-lchild=new Bitree;coutp-lchild-w;if(p-lchild-w!=0)creat(p-lchild);else Bitree *q=p-lchild;p-lchild=0;delete q;/右孩子p-rchild=new Bitree;coutp-rchild-w;if(p-rchild-w!=0)creat(p-rchild);else Bitree *q=p-rchild;p-rchild=0;delete q;void Create()root=new Bitree;/按照树的先序遍历顺序输入数据,并且当结点的左右孩子不存在时输入0coutroot-w;if(root-w!=0)creat(root);else Bitree *p=root;root=0;delete p;/下面两个函数为判断二叉树是否为二叉排序树void judgeBST(Bitree *root)Bitree *l,*r;if(root!=0)if(i=0) l=root-lchild;if(l!=NULL&root-ww)i+;return;judgeBST(l);if(i=0)r=root-rchild;if(r!=NULL&root-wr-w)i+;return;judgeBST(r); void judge1()if(i=0)cout是二叉排序树!endl;else cout不是二叉排序树!lchild,count,mark); judgeAVL(root-rchild,count,mark); void judge2(int mark)int mark2=0;for(int j=0;ji;j+)if(markj-mark01)mark2=1;if(mark2=0)cout是平衡二叉树!;else cout不是平衡二叉树!;/主函数void main()Create();/创建二叉树 /判断二叉树是否为二叉排序树 i=0;/标志 judgeBST(root); judge1(); /判断二叉树是否为平衡二叉树 int count=0,markMax; i=0;/计数 judgeAVL(root,count,mark); judge2(mark); 4.2调试分析整个程序分为三大块:建立二叉树、判断是否为二叉排序树、判断是否为平衡二叉树。4.2.1建立时开始没有考虑二叉树为空的情况,并且没有注意不用的空间应释放。经调整,已解决。4.2.2判断二叉树是否为二叉排序树时,开始没注意到当结点为空时,是不能进行权值的大小比较的。并且标志i一旦不为0即可不再进行比较了。4.2.3二叉树是否为平衡二叉树时,应注意到只要markj-mark01满足其一就可,所以应用或运算符。4.2.4调试中数据的输入应充分考虑各种情况:二叉树为空;二叉树非空时,既是二叉排序树又是平衡二叉树、是二叉排序树不是平衡二叉树、是平衡二叉树不是二叉排序树、既不是二叉排序树也不是平衡二叉树。这样就可以充分检验程序的正确性。4.3调试结果根据二叉树的先序遍历顺序输入结点,若结点不存在,输入结点数据0(或左右孩子不存在时,孩子结点数据输入0)4.3.1请输入结点数据:0 是二叉排序树! 是平衡二叉树!4.3.2请输入结点数据:4 请输入结点数据:3 请输入结点数据:2 请输入结点数据:0 请输入结点数据:0 请输入结点数据:0 请输入结点数据:1 请输入结点数据:0 请输入结点数据:0 不是二叉排序树! 是平衡二叉树!4.3.3请输入结点数据:5 请输入结点数据:3 请输入结点数据:2 请输入结点数据:0 请输入结点数据:0 请输入结点数据:0 请输入结点数据:0 是二叉排序树! 不是平衡二叉树!4.3.4请输入结点数据:4 请输入结点数据:5 请输入结点数据:2 请输入结点数据:0 请输入结点数据:0 请输入结点数据:0 请输入结点数据:0 不是二叉排序树! 不是平衡二叉树!4.3.5请输入结点数据:5 请输入结点数据:4 请输入结点数据:2 请输入结点数据:0 请输入结点数据:0 请输入结点数据:0 请输入结点数据:7 请输入结点数据:6 请输入结点数据:0 请输入结点数据:0 请输入结点数据:8 请输入结点数据:0 请输入结点数据:0 是二叉排序树! 是平衡二叉树!5有关技术的讨论 本程序要解决的问题是建立一个二叉树,判断此二叉树是否为二叉排序树,判断此二叉树是否为平衡二叉树。其中每个算法的设计都需要用到递归思想。下面讨论一下这些算法思想:5.1建立二叉树时,是按照先序遍历的思想递归建立的。递归的思想是:先建立根结点,然后建立左孩子,最后建立右孩子。当某个结点为空时,输入其权值为0。5.2判断二叉排序树时,先让根结点和左孩子结点比较,然后以左孩子结点为根结点,重复上述过程。接着让根结点和右孩子结点比较,过程同上。比较过程中一旦根结点小于其左孩子(或大于其右孩子),即让标致i变为1结束程序。标致i=1时,二叉树不是二叉排序树;i=0时,是二叉排序树。5.3判断平衡二叉树时,是按照边先序遍历边求深度的方法,具体思想见上述算法。6设计体会通过这几天的课程设计,我对计算机的应用、对数据结构的应用、对CC+语言的应用有了更深的了解和认识。在理论结合实践时,我深深地感受到了所学知识的不扎实和不足。我深刻的体会到了原来实践是检验所学知识检验理论的最好方法;并且理论知识和实际应用也有很大的差距,我们只有多动手、多动脑,理论联系实际,才能更加扎实牢固地掌握所学知识。同时,通过课程设计我也了解到原来我们所学的知识和实际的联系是那么的紧密,原来我们所学的知识在实际生活中的用处可以这样大。这几天的算法设计和上机实验,使我的代码编写能力,思维能力都有了很大的提高。在代码的编写和调试过程中,我学会了如何最快的找出错误,如何思维更加严密,更加完全的写一个算法。同时,我也体会到了,当发现错误时,要不急不躁,认真分析程序,当自己实在是找不出来时,也要学会寻求帮助,并且在他人思路的引导下,找自己的错误,认真反省和思考,争取以后不再犯此类错误,学会他人分析查找程序中错误的方法。在实际的上机操作过程中,不仅是让我了解数据结构的理论知识,更重要的是培养解决实际问题的能力,同时我也体会到了编程的乐趣,当我终于把问题解决看到程序成功运行时那份喜悦和骄傲是无以言表的。通过这次课程设计我们的分析设计能力和编程能力有了很大提高,为后续课程的学习及实践打好了坚实的基础。结束语 数据结构是一门理论性强、思维抽象、难度较大的课程,使我们基础课和专业课之间的桥梁。通过本门课程的学习,我们能够理解各种数据对象的特点,学会数据的组织方法和实现方法,并进一步培养良好的程序设计能力和解决实际问题的能力,而且这门课程的研究方法对我们在校和离校后的学习和工作也有着重要的意义。 对于这次短短的课程实践,我还要谢谢我的指导老师胡燕老师,实践中我得到了胡燕老师的很多关心和帮助。她传授给我们的信息在课程设计中的作用很大,使我顺利地完成了课程实践任务。 时间过得真快,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论