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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

线索二叉树设计报告.docx

1、线索二叉树设计报告河南城建学院数据结构课程设计说明书题目: 线索二叉树的应用 院 系: 计算机科学与工程系 专业班级: 0614082 学 号: 061408227 学生姓名: 李文龙 指导教师: 张延红 2010年 06 月 25 日1.需求分析 - 3 -1.1线索功能模块 - 3 -1.2创建功能模块 - 3 -1.3删除和添加功能模块 - 3 -2.概要设计 - 3 -2.1功能设计 - 3 -3详细设计 - 6 -3.1详细代码分析 - 9 -3.2创建功能模块 - 11 -3.3调试情况分析 - 14 -4.总结 - 15 -4.1编程心得 - 15 -参考资料 - 15 -1.需

2、求分析本程序是用VC+6.0软件,可以实现对二叉树的创建,遍历以及线索等功能的实现,同时实现了界面的操作功能,便于工作人员操作。1.1线索功能模块本程序的重点是对二叉树的线索化以及对二叉树删除节点和添加节点后的线索的进行。1.2创建功能模块在我们这次编写的这个程序中,可以通过:广义表构造法,先序和中序构造法,以及中序和后序构造法等三种供你选择,操作者可以通过不同的构建方式来构建所要查询的二叉树。1.3删除和添加功能模块在二叉树的基础上进行对二叉树的添加和删除节点。2.概要设计2.1功能设计(1)treenode二叉树的节点设计,通过这部分模块,指定了二叉树的各个结点位置,为实现二叉树里面的各个

3、功能,实现了相互的连接。例如:通过这部分的功能实现,可以直接让双亲指向左右子数,同时,也可以让左右子树和双亲结点相互相连。实现他们之间的交互功能。(2)PreOrderTraverse()二叉树的前序排列运算函数,在这段功能实现上,依据二叉树的性质,实现其相应的功能,并能狗通过输入的前序排列,结合其他情况的排列,生成一个正确的二叉树。(3)LevelOrderTraverse()中序排列的运算函数,在这个模块里,我们定义了二叉树的中序排列的定义,以及中序排列的运算方法,在具体的功能实现时,可以结合其他的排序方式生成正确的二叉树。(4)PostOrderTraverse()后序二叉树的运算函数,

4、在这个运算函数里,集成了函数的构造运算形式,以及,在对二叉树进行排序的排列的运算方法。同时,我们还能够结合其他的排列模式,构建合理的二叉树运算。(5)InOrderTraverse()遍历二叉树的运算函数,在这个函数模块里,我们主要是用C+语言编写了,二叉树的生成情况,通过相应情况的输入,生成适当的二叉树。(6)GetData()获得函数的大小值,并输出。(7)LeftChild()左子树节点,在这个函数结构里,我们设定了节点的运算方式,同时通过相应的函数结构实现了,他与双亲及右子树的关系。(8)RightChild()右子树函数,同左子树节点功能相同,通过内部结合的函数,联系双亲及右子树。(

5、9)destroy()通过相关的函数运算过程,实现删除的运算功能,在我门的本函数中,主要是实现无用节点的删除功能(10) Bool InOrderThreading(TreeNode *head); /中序线索 void InThreading(TreeNode *p,TreeNode* &pre); void Display1(TreeNode *p); /通过线索进行二叉树的遍历 bool PreOrderThreading(TreeNode *head); /前序线索 void PreThreading(TreeNode *p,TreeNode* &pre); void Display2

6、(TreeNode *p); /通过前序线索遍历 bool PostOrderThreading(TreeNode *head); /后序线索 void PostThreading(TreeNode *p,TreeNode * &pre); void Display3(TreeNode *p); /通过后序线索遍历 void Destroy(); /消去线索 void Destory(TreeNode *p); /销毁函数(11) bool Insert(T data); /插入结点 bool Remove(T data); /删除值为data的节点2.2算法流程图3详细设计3.1视图界面设计

7、(菜单栏显示情况)(二叉树的界面生成效果)(遍历显示)线索化插入结点删除节点3.1详细代码分析1.线索化模块templatebool Tree:InOrderThreading(TreeNode *head) if(head=NULL) return 0; TreeNode *pre=NULL; if(root=NULL) head-SetRightChild(head); head-SetLeftChild(head); else pre=head; InThreading(root,pre); pre-SetRightChild(head); pre-SetRflag(); head-Se

8、tLeftChild(pre); head-SetLflag(); return 1;templatevoid Tree:InThreading(TreeNode *p,TreeNode* &pre) if(p!=NULL) InThreading(p-GetLeftChild(),pre); if(!p-GetLeftChild() p-SetLflag(); p-SetLeftChild(pre); if(!pre-GetRightChild() pre-SetRflag(); pre-SetRightChild(p); pre=p;InThreading(p-GetRightChild(

9、),pre);templatebool Tree:PreOrderThreading(TreeNode *head) if(head=NULL) return 0; TreeNode *pre=NULL; if(root=NULL) head-SetRightChild(head); head-SetLeftChild(head); else pre=head; PreThreading(root,pre); pre-SetRightChild(head); pre-SetRflag(); head-SetLeftChild(pre); head-SetLflag(); templatevoi

10、d Tree:PreThreading(TreeNode *p,TreeNode* &pre) if(p!=NULL) if(pre-GetLflag()=0 & (p-GetData()=pre-GetData() | pre-GetLeftChild()-GetData()=p-GetData() return; if(!p-GetLeftChild() p-SetLflag(); p-SetLeftChild(pre); if(!pre-GetRightChild() pre-SetRflag(); pre-SetRightChild(p); pre=p; PreThreading(p-

11、GetLeftChild(),pre); PreThreading(p-GetRightChild(),pre); templatebool Tree:PostOrderThreading(TreeNode *head) if(head=NULL) return 0; TreeNode *pre=NULL; if(root=NULL) head-SetRightChild(head); head-SetLeftChild(head); else pre=head; PostThreading(root,pre); if(pre-GetRightChild()=NULL) pre-SetRigh

12、tChild(head); pre-SetRflag(); head-SetLeftChild(pre); head-SetLflag(); return 1;templatevoid Tree:PostThreading(TreeNode *p,TreeNode * &pre) if(p!=NULL) PostThreading(p-GetLeftChild(),pre); PostThreading(p-GetRightChild(),pre); if(pre-GetLflag()=0 & ( p-GetData()=pre-GetData() | pre-GetLeftChild()-G

13、etData()=p-GetData() return; if(!p-GetLeftChild() p-SetLflag(); p-SetLeftChild(pre); if(!pre-GetRightChild() pre-SetRflag(); pre-SetRightChild(p); pre=p; 3.2创建功能模块在这个模块中,我们通过3种方式对二叉树进行创建。1. 2. 前序和中序3. 中序和后序在这里这写上了广义表方法,其他两种方法是转变为广义表进行二叉树的建立。templateTreeNode& Tree:operator=(string s) Destory(root); r

14、oot=NULL; TreeNode *index1024; TreeNode *p=NULL; int top=-1,sum=0,number=0; bool mark=1; for(int i=0;is.size();i+) char ch=si; switch(ch) case (: index+top=p; mark=1; break; case ): top-; break; case ,: mark=0; break; default: p=new TreeNode(ch); sum+; if(root=NULL) root=p; else if(mark) indextop-Se

15、tLeftChild(p); p-SetParent(indextop); else indextop-SetRightChild(p); p-SetParent(indextop); number=CountNode(root); if(sumnumber) Destory(root); root=NULL; return *root; 3.2删除和添加功能模块在这个模块中对于已经存在的二叉树进行插入和删除节点。重点介绍插入节点。templatebool Tree:Insert(T data) TreeNode* p=Find(data); if(p=NULL) return false;

16、else coutstring(15, )请入你想插入到左孩子(0)还是右孩子(其他):endl; char i; i=getch(); coutstring(15, )data; if(i=0) InsertLeftChild(p,data); else InsertRightChild(p,data); return true;3.3调试情况分析(生成二叉树时输入情况)(在菜单选择时输入错误)上图为一输入错误情况的处理的显示情况,根据页面显示我们可以看出我们针对运行中可能出现的各种错误进行了相应的错误处理机制,就如上图所言,在我们在生成二叉树的情况时,在我们输入错误的情况时,显示页面会提醒

17、你,你输入有误,在进行功能的选择时,当我们输入的选择情况不满足情况时,我们的设计的对话框会自动提醒你:您的输入有误,请从新输入。3.4算法分析PreOrderTraverse(TreeNode* p) 递归先序遍历InOrderTraverse(TreeNode* p) 递归中序遍历PostOrderTraverse(TreeNode* p) 递归后序遍历 对于这三个递归遍历的情况,按惯例来说时间复杂度为O(n),空间复杂度为O(n)void PreOrderTraverse( TreeNode* p) 非递归先序遍历void InOrderTraverse( TreeNode* p) 非递归

18、中序遍历void PostOrderTraverse( TreeNode* p) 非递归后序遍历对于这三个遍历的情况,时间复杂度为O(n),空间复杂度为O(n)。这只是针对最坏的情况而言的。利用栈来进行遍历LevelTraverse() const; 层遍历对于层遍历来说,时间复杂度为O(n),空间复杂度为O(n)。这只是针对最坏的情况而言的。利用队列来进行遍历。int CountNode(TreeNode *p) 查询二叉树的叶子结点个数对于这个函数,时间复杂度为O(n),空间复杂度为O(log2n)。int Depth(TreeNode *p) 查询二叉树的深度对于这个函数,时间复杂度为O

19、(n),空间复杂度为O(log2n)。PrintTree(TreeNode *p) 以树的形状输出二叉树对于这个函数来说,时间复杂度为O(n),空间复杂度为O(n)。这个函数根据树的深度和层遍历来实现的。其时间和空间复杂度和树深度,层遍历一致。Insert(T data); /插入结点Remove(Tdata); /删除值为data的节点这两个函数都是基于TreeNode* Find(T& data)函数来进行的。而TreeNode* Find(T& data)函数是走层遍历进行的。其时间和空间复杂度都为O(n)。其他线索函数基本走的都是遍历中该其指针的过程,时间复杂度为O(n),空间复杂度为

20、O(n)。4.总结4.1编程心得通过这次实验,我体会到深刻理解数据结构的重要性。只有真正理解定义数据类型的好处,才能用好这样一种数据结构。在一开始定义数据结构时,我因为不细心,总会有或多或少的问题出现,如数据域与指针域的定义类型的不同。在输好了结构体之后,我开始一个个编写本次实验要求实现功能的子函数。以前在学C+语言时总觉得函数的递归调用是一样很复杂的算法,经常会理解不了而导致编程的错误。但在这次实验中,二叉树的先序、中序与后序的输出都用了递归算法。而且用起来并不复杂,这使我更进一步学习理解了函数的递归调用并得到灵活的运用。当然,本次实验发现自己还有不足的就是对指针认识的不深入,也常常使所设计

21、的程序无法实现需求功能;再者,在利用中序非递归遍历的时候也出现了程序崩溃的错误,这是因为我一开始是打算用链栈的存储结构来实现该子函数的,但在利用栈中的元素是指向二叉链表结点的指针时,我并不能够写出其各遍历的算法语句,因此,经过多番的调试都无法使程序正常运行。于是,我便放弃用链栈,转而用栈的顺序存储结构来实现。经过本次实验基本上解决的一些所遇到的问题,我对二叉树的结构等有了较为深入的理解。我会继续我的兴趣编写程序的,相信在越来越多的尝试之后,自己会不断进步。参考资料1.Visual c+6.0实例精通 谢勇 编著-科学出版社2.c+代码设计与重用-人民邮电出版社3.Visual C+6.0编程宝典-电子子工业出版社4.数据结构c+语言描述-应用标准模板类(STL)5.C+高级语言程序设计-清华大学出版社6.数据结构(C语言版)-清华大学出版社7数据结构-南京大学出版社8.数据结构算法与应用(C语言描述)-机械工业出版社9.数据结构与算法-清华大学出版社10.数据结构(c+)版电子工业出版社

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

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