




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、题 目: 基于层次遍历的二叉树算法设计初始条件:理论:学习了数据结构课程,掌握了基本的数据结构和常用的算法;实践:计算机技术系实验室提供计算机及软件开发环境。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1、系统应具备的功能:(1)建立二叉树(2)按层次遍历二叉树2、数据结构设计;3、主要算法设计;4、编程及上机实现;5、撰写课程设计报告,包括:(1)设计题目;(2)摘要和关键字;(3)正文,包括引言、需求分析、数据结构设计、算法设计、程序实现及测试、不足之处、设计体会;(4)结束语;(5)参考文献。时间安排: 2007年7月2日7日 (第18周)7月2日
2、查阅资料7月3日 系统设计,数据结构设计,算法设计7月4日-5日 编程并上机调试7月6日 撰写报告7月7日 验收程序,提交设计报告书。指导教师签名: 2007年7月2日系主任(或责任教师)签名: 2007年7月2日 基于层次遍历的二叉树算法设计摘要:本程序设计实现二叉树的层次遍历,该程序主要部分包括:创建二叉树,按层次遍历二叉树。.关键字:二叉树,队列,二叉链表,数据结构 .0.引言: 树型结构是一类重要的非线性数据结构,其中一树和二叉树最重要。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构够可以用树来形象表示。树在计算机领域中也得到了广泛应用,如在编译程序中,可以用树来表示源
3、程序的语法结构。二叉树是一种非线性数据结构,对它进行操作时总需要对每个数据逐一进行操作,这样就存在一个操作顺序问题,由此提出了二叉树的遍历操作问题,所谓遍历二叉树就是按某种顺序访问二叉树中某个结点一次且仅一次的过程,这里的访问可以是输出.比较.更新.查看元素内容等各种操作。1.需求分析:1.1行输入数据构造二叉树。1.2用队列存储二叉树结点。1.3算法实现层次遍历。1.4实现过程: A:初始,系统开始运行后,要先构造二叉树,先输入根结点数据信息。 B:根据提示信息输入其左子树,若没有左子树则输入“-1”。 C:根据提示信息输入其右子树,若没有右子树则输入“-1”。 D:在二叉树构造完成之后程序
4、会自动按层次遍历二叉树,并且输出相应结点数据信息。 E:在完成上述过程之后按任意键结束程序。2.数据结构设计:2.1树的链式存储typedef struct Bitnode/*树的链式存储*/BitTreeElementType data;struct Bitnode *lchild;/*左孩子 */struct Bitnode *rchild;/*右孩子*/BTnode,*BitTree;2.2队列定义QueueElemtype dataQUEUESIZE;int front;/*队列的头指针*/int rear;/*队列的尾指针*/queue;3.算法设计3.1主函数模块main()“输入
5、结点数据”;初始化二叉树;“层次遍历二叉树”;层次遍历二叉树;3.2初始化二叉树模块Statu CreateBitTree(BitTree *T)为树指针T分配空间;输出“输入数据”;存储输入数据;if ( 出入数据=空字符)结点不存储信息;else 结点存储输入的信息; 输出“创建左子树”; CreateBitTree(&(*T)->lchild); 输出“创建右子树”; CreateBitTree(&(*T)->rchild);3.3层次遍历二叉树模块Statu LayerTravelBitTree(BitTree T)创建队列tq;向队列tq尾插入T;whil
6、e ( 队头非空时) 访问队头元素; 将树左子树插入队尾; 将树右子树插入队尾;3.4创建队列模块int CreateQueue(queue *q)对头指针和队尾指针相等;3.5插入队列元素模块int EnQueue(queue *q, QueueElemtype c)队尾指针加1;if (队尾指针超过队列长度) 输出“OVERFLOW”; 退出程序;将c存为队尾元素;3.6删除队列元素模块Statu DeQueue(queue *q, QueueElemtype *ret)if (队头指针和队尾指针相等) 返回错误;头指针加1;将队头元素存于ret中;3.7访问结点模块Statu Visit
7、Data(BitTreeElementType data)输出结点存储的信息;3.7主要技术说明程序用链式存储结构和队列分别存储二叉树和二叉树的结点。一方面采用队列存储结点是结合层次遍历二叉树和队列“先进先出”的特点综合考虑的,因为层次遍历即从上到下从左到右依次遍历二叉树结点,而队列恰好可以从上到下从左到右顺序进队然后顺序出队,符合设计的要求。另一方面采用二叉树的链式存储结构而非顺序存储结构是因为构造二叉树需用到递归算法,采用链式存储结构容易实现。初始化二叉树的实现:首先输入根结点,若根结点非空则将其设为树的根结点,否则返回“FALSE”;其次输入结点左子树,若非空则将其存为上一结点的左子树,
8、否则输入右子树;若非空则将其存为上一结点的右子树,否则结束,完成二叉树初始化。递归重复以上操作即可初始化二叉树。本系统对用户在操作时可能进行的错误和违规操作,给出了基本的提示信息,以便用户在非法操作后得到意想不到的结果。4.程序实现4.1库函数#include<stdio.h> /*I/O函数*/#include "conio.h"4.2定义宏#define QUEUESIZE 100 /*队列初始容量*/#define TRUE 1#define FALSE !TRUE#define Statu int#define BitTreeElementType in
9、t#define SHUJU "%d"#define END -14.3定义全局变量typedef struct Bitnode/*树的链式存储*/BitTreeElementType data;struct Bitnode *lchild;/*左孩子 */struct Bitnode *rchild;/*右孩子*/BTnode,*BitTree;typedef BitTree QueueElemtype;typedef struct/*定义数据结构*/QueueElemtype dataQUEUESIZE;int front;/*队列的头指针*/int rear;/*队列
10、的尾指针*/queue;4.4函数原型int CreateQueue(queue *q);/*创建队列*/int EnQueue(queue *q, QueueElemtype c);/*向队尾插入元素c*/Statu DeQueue(queue *q, QueueElemtype *reb);/*队头元素出队用reb返回其值*/Statu CreateBitTree(BitTree *T);/*初始化二叉树*/Statu LayerTravelBitTree(BitTree T);/*层次遍历二叉树*/4.5主函数main()BitTree t;printf("Input data
11、 to create bittree and '");printf(SHUJU,END);printf("' will make null tree.n");/*输入根结点 */CreateBitTree(&t);/*初始化二叉树*/printf("Layer order travel the tree:n");/*层次遍历二叉树*/LayerTravelBitTree(t);/*层次遍历二叉树*/4.6初始化二叉树 Statu CreateBitTree(BitTree *T)/*初始化二叉树*/BitTreeElem
12、entType inputdata;*T = (BitTree )malloc(sizeof(BTnode);printf("Enter Data:");/*输入数据*/fflush(stdin);scanf(SHUJU,&inputdata);if ( inputdata = END) *T = NULL; return FALSE;else (*T)->data = inputdata;/*将输入的数据存入结点*/ printf("Create left sub tree.<"); CreateBitTree(&(*T)-
13、>lchild);/*递归循环输入左子树*/ printf("Create right sub tree.<"); CreateBitTree(&(*T)->rchild);/*递归循环输入右子树*/ return TRUE;4.7层次遍历二叉树 Statu LayerTravelBitTree(BitTree T)/*层次遍历二叉树*/queue tq;/*队列tq*/QueueElemtype res;/*用来返回对头元素*/CreateQueue(&tq);/*创建队列*/EnQueue(&tq,T);/*将T插入队尾*/wh
14、ile ( DeQueue(&tq,&res) = TRUE)/*当队头元素不空时执行while循环*/ if (res) VisitData(res->data);/*访问队头元素*/ EnQueue(&tq,res->lchild);/*将结点左孩子插入队尾*/ EnQueue(&tq,res->rchild);/*将结点右孩子插入队尾*/ 4.8创建空队列int CreateQueue(queue *q)q->front = -1;q->rear = -1;4.9队尾插入元素(结点入队)int EnQueue(queue *q
15、, QueueElemtype c)/*将元素c插入队尾*/q->rear+;/*尾指针加1*/if (q->rear >= QUEUESIZE)/*若尾指针超出队列长度则提示错误*/ printf("Queue overflow!n"); exit(0);q->dataq->rear = c;return 1;4.10队头元素出队Statu DeQueue(queue *q, QueueElemtype *ret)/*队头元素出队并用ret返回其值*/if (q->front = q->rear)/*若队列为空,则返回错误提示*/
16、 return FALSE;q->front+;/*头指针加1*/*ret = q->dataq->front;return TRUE;4.11访问结点Statu VisitData(BitTreeElementType data)printf(SHUJU,data);printf("n");return TRUE;4.12程序运行结果主界面:结果分析:实验结果的排序完全正确。程序可以实现用户自己构造二叉树,然后实现对二叉树的层次遍历。程序基本上满足了算法设计要求,但是仍有地方值得提高,仍需完善。5.设计体会 通过课程设计自己对数据结构这门课程有了更深一层的了解,意识到了数据结构的重要性,同时也对c语言的掌握更进一步,熟悉了对于指针,链表,队列等的操作,对程序设计的过程也有了自己的一些理解:首先,要对到手的问题要认真思考,如何实现,用何种方法实现,力求最简,在保证正确性的基础上提高程序效率;其次,确定了实现的方法之后就要用程序语言将想法表示出来;最后,进行调试和排错,一个有效的方法是在前面遇到问题时在
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 数学 2025《高中考前》高考冲刺考试方法答题技巧高考预测数学热点5 统计与概率含答案
- 料理教室探秘 厨艺之旅
- 驾驶员的座椅调整与安全
- 《建筑施工安全之脚手架构造与操作规范》课件
- 肩袖损伤手术演示 肩袖损伤手术细节操作注意事项
- 区块链智能合约平台架构的教与学
- 《财务支出教学课件》
- 医学教育的未来趋势结合医疗大数据进行精准教育
- 机械工程师资格证书考试的学术道德与诚信建设探讨试题及答案
- 质量工程师资格考试知识点的跨学科关联试题及答案
- GA/T 914-2010听力障碍的法医学评定
- GA/T 642-2020道路交通事故车辆安全技术检验鉴定
- HXD1C机车总体介绍课件
- 财经法规与会计职业道德会计法律制度
- 综合实践 叠衣服课件
- 职工代表大会有关表格
- 三轮车驾驶安全操作规程(机动三轮车和电动三轮车)
- 施工现场签证单(模板)
- 2022年五年级下册阅读指导教案设计-
- 劳动关系管理法律实务案例题库及答案(案例题)
- 怎样用PPT制作翻书效果
评论
0/150
提交评论