树和二叉树相互转换的实现-数据结构课程设计

上传人:Flo****ea 文档编号:124919917 上传时间:2020-03-14 格式:DOC 页数:27 大小:289.50KB
返回 下载 相关 举报
树和二叉树相互转换的实现-数据结构课程设计_第1页
第1页 / 共27页
树和二叉树相互转换的实现-数据结构课程设计_第2页
第2页 / 共27页
树和二叉树相互转换的实现-数据结构课程设计_第3页
第3页 / 共27页
树和二叉树相互转换的实现-数据结构课程设计_第4页
第4页 / 共27页
树和二叉树相互转换的实现-数据结构课程设计_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《树和二叉树相互转换的实现-数据结构课程设计》由会员分享,可在线阅读,更多相关《树和二叉树相互转换的实现-数据结构课程设计(27页珍藏版)》请在金锄头文库上搜索。

1、河南工程学院数据结构与算法课程设计成果报告树和二叉树相互转换的实现学生学号: 学生姓名: 学 院: 计算机学院 专业班级: 软件工程1341 专业课程: 数据结构与算法 指导教师: 2014 年 12 月 29 日题 目树与二叉树相互转化的实现考核项目考核内容得分平时考核(30分)出勤情况、态度、效率;知识掌握情况、基本操作技能、知识应用能力、获取知识能力系统设计(20分)分析系统的功能模块编程调试(20分)实现系统的各个功能模块,并完成调试回答问题(15分)回答老师针对课程设计提出的问题课程设计报告撰写(10分)严格按照规范要求完成课程设计报告源代码(5分)按照规范要求完成课程设计源代码的排

2、版总 评 成 绩指导教师评语: 日期: 年 月 日目 录1 课程设计目标11.1课程实现的目的11.2 课程设计任务11.3 课程设计任务的具体分析12 分析与设计22.1 题目算法分析22.2 存储结构设计32.3 算法描述32.4 程序流程图42.5 算法实现说明83 程序清单124 测试134.1 测试数据134.2 测试结果分析135 总结14参考文献151 课程设计目标与任务1.1 课程设计目标这次课程设计的目标是通过这次的课程设计,能够使我们在数据结构的选择和应用、算法的设计与实现方面得到训练,加深对数据结构基本内容的理解和灵活应用,同时,在程序设计方法及上机操作方面受到比较系统严

3、格的训练,培养软件工作所需要的动手能力,熟练的掌握数据结构有关知识的应用,加深对数据结构有关知识的理解和应用,进一步提高自己的编程能力,提高自身的动手能力。1.2 课程设计任务利用本学期所学的数据结构的有关知识,实现树与二叉树相互转换,设计树与二叉树转换的相关函数库,以便在程序设计中调用,要求:(1)实现树与二叉树的转换;(2)借助语言环境实现图形显示功能,以便将抽象的数据结构以图形方式显示出来,将复杂的运行过程以动态方式显示出来;(3)给出若干例程,演示通过调用自己所缩写程序来实现相关问题的求解。该课程设计通过实现树与二叉树的转换,理解树与二叉树的相互转化关系,掌握树与二叉树的存储结构的异同

4、,加深对二叉树和树的理解。1.3 课程设计任务的具体分析 课程设计的任务是实现树与二叉树的转换,并且借助语言环境实现图形显示功能,以便将抽象的数据结构以图形方式显示出来,将复杂的运行过程以动态方式显示出来,因此应该充分理解二叉树与树之间的相互联系,明白两者的转换关系,了解树和二叉树的存储结构的异同,树和二叉树逻辑上都是树形结构,但是二者之间仍有区别,二叉树的度至多为2,但是树没有此限制,二叉树有左右子树之分,树没有此限制。了解二者是如何转化的,在转化的过程中,利用结构指针访问树的根结点和孩子结点,生成二叉树,并且利用队列,递归算法的有关知识,实现将树转化成二叉树的结果。2 分析与设计2.1 题

5、目算法分析该课程设计需要实现树与二叉树的相互转换,明白二者的转换关系,二叉树的根即为树的根,二叉树的左子树为树的左子树,从根开始一直向右,遇到的右子树均依次作为树的子树。将树转换为二叉树,关键是把n个分支变为两个分支,步骤如下:(1)保留所有结点与其左子结点的链接;(2)打断所有结点原本与右结点的链接;(3)连结所有兄弟结点(拥有同一个父结点的子结点);(4)将兄弟结点顺时钟转45,树中右侧兄弟变为二叉树中该结点右子树。将二叉树转换为树,步骤如下:(1)二叉树的根即为树的根;(2)打断所有结点与其右子树的链接;(3)二叉树的左子树为树的左子树,从根开始一直向右,遇到的右子树均依次作为树的子树(

6、二叉树中结点的右子树中变为该结点右侧的兄弟)。2.2 存储结构设计分析树和二叉树的存储结构,二叉树的存储结构如图2.1。图2.1二叉树的存储结构图树是一种非线性的数据结构,树中的元素之间是一对多的层次关系。常用的有三种存储结构,即双亲表示法、孩子表示法、和孩子兄弟表示法。 事实上,一棵树采用孩子兄弟表示法所建立的存储结构与它所对应的二叉树的二叉链表存储结构是完全相同的,只是两个指针域的名称及解释不同而已,通过图直观的表示了树与二叉树之间的对应关系和相互转换方法。如图2.2。图2.2 树和二叉树的转换图2.3 算法描述先遍历多叉树,将所有结点得到,然后结据相应的二叉树的规则构造二叉树就行了,将多

7、叉树的第一个儿子结点作为二叉树的左结点,将其兄弟结点作为二叉树的右结点。利用指针,遍历算法,队列的入队出队等算法,实现将树的根结点作为二叉树的根结点的操作,一棵树采用孩子兄弟表示法所建立的存储结构与它所对应的二叉树的二叉链表存储结构是完全相同的,只是两个指针域的名称及解释不同而已,且树与其对应的生成二叉树的前序遍历是相同的,可以用此来验证由树所转换成的二叉树是否正确。2.4 程序流程图该程序是先建立树,再以树为基础,将树转换成二叉树。该程序的流程是建立树,利用队列,递归,指针等,将树的根结点变为二叉树的根结点,进行树到二叉树的转换,程序的最终目的是根据输入的树的接点,孩子结点及其父亲结点,生成

8、二叉树,将树的先序遍历结果和二叉树的先序遍历的结果输出。如图2.3。主菜单树的信息图二叉树的信息图输入信息生成树输入树的结点数输入孩子结点及其父亲结点输出树的前序遍历输出二叉树的前序遍历图2.3 程序流程图2.5 算法实现说明(1)输入关于树的结点后,遍历每个结点的操作就是输出该结点的data域,首先先遍历树的根结点,再先序遍历树的孩子结点。void preorderTree(CTreeNode *ctroot)/遍历每个结点的操作就是输出该结点的data域 CTreeNode *ctchild; int i; coutdata ;/先遍历根结点 for(i=0;ichildreni; if(

9、ctchild=NULL) break;/孩子结点遍历结束,退出 else preorderTree(ctchild);/递归先序遍历(2)定义BTreeNode *BTreeArrayMAX_NODE_NUM结构体指针数组,用于存放结点的地址,开始初始化树队列,二叉树队列,并且分别将树和二叉树的元素分别进行入队操作,在元素进入队列时要进行判断队列,看是否为满。然后再把树队列元素出队,要进行队列是否为空的判断,利用指针返回结点的值,然后进行二叉树队列元素出队,返回空指针后返回结点。该段程序的关键是元素的出队入队操作。typedef struct nodeBTreeBTreeNode *BTre

10、eArrayMAX_NODE_NUM;/结构体指针数组,存放结点的地址/struct nodeBTree *next;int BTreeFront,BTreeRear;QueueBTree;/初始化树队列void initQueueCTree(QueueCTree *&q) q=(QueueCTree *)malloc(sizeof(QueueCTree); q-CTreeFront=q-CTreeRear=0;/初始化二叉树队列void initQueueBTree(QueueBTree *&q) q=(QueueBTree *)malloc(sizeof(QueueBTree); q-BT

11、reeFront=q-BTreeRear=0;int addQueueCTree(QueueCTree *&q,CTreeNode *ctroot) if(q-CTreeRear+1)%MAX_NODE_NUM=q-CTreeFront)/队满 return 0; q-CTreeRear=(q-CTreeRear+1)%MAX_NODE_NUM; q-CTreeArrayq-CTreeRear=ctroot; return 1;/入队列/二叉树队列元素入队int addQueueBTree(QueueBTree *&q,BTreeNode *btroot) if(q-BTreeRear+1)%

12、MAX_NODE_NUM=q-BTreeFront)/队满 return 0; q-BTreeRear=(q-BTreeRear+1)%MAX_NODE_NUM; q-BTreeArrayq-BTreeRear=btroot; return 1;/入队列(3)下面是树转换成二叉树的关键操作,树转换成二叉树时利用ctroot指向树的根结点,利用btroot指向二叉树的根,增添一个辅助队列,并且增加开辟内存空间的语句,并且树的根结点会作为二叉树的根结点,树的根结点入队后二叉树的根结点入队,然后树结点出队,二叉树的结点出队,访问所有的孩子结点后,分配二叉树的结点,按照树转换成二叉树的规则,二叉树的左

13、子树为树的左子树,从根开始一直向右,遇到的右子树均依次作为树的子树(二叉树中结点的右子树中变为该结点右侧的兄弟),将树转化成二叉树。void TreeToBTree(CTreeNode *ctroot,BTreeNode *&btroot)/树转化为二叉树ctroot指向树的根结点,btroot,指向二叉树的根 QueueCTree *VisitedCTreeNodes; QueueBTree *VisitedBTreeNodes;/辅助队列 initQueueCTree(VisitedCTreeNodes); initQueueBTree(VisitedBTreeNodes);/初始化队列 CTreeNode *ctnode; BTreeNode *btnode,*p,*LastSibling; int i; btroot=(BTreeNode *)malloc(sizeof(BTreeNode);/添加开辟内存空间语句 btroot-data=ctroot-data;/树的根结点作为二叉树的根结点 btroot-lchild=btroot-rchild=NULL; addQueueCTree(VisitedCTreeNodes,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号