数据结构课程设计报告-二叉树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
涉外经济学院
课程设计报告
课程名称:数据结构
报告题目:二叉树的基本操作
学生:肖琳桂、康政、小东、帆
所在学院:信息科学与工程学院
专业班级:软工本1402 学生学号: 144300211、02、14、08 指导教师:春庭
2015 年 12 月 31 日课程设计任务书
摘要
本课程设计主要说明如何在C++编程环境下实现二叉树的遍历,遍历方式包括:二叉树的先序遍历、中序遍历、后序遍历,层次遍历等四种遍历方式。同时,此次课程设计还包括了求二叉树深度和结点个数,结点的孩子信息,以及对文件
的操作,用文件读取的方式实现对二叉树的建立。以通过此次课程设计,使学生
充分掌握树的基本操作,以及对线性存储结构的理解。同时,在对树的遍历的操
作过程中,同样是运用递归的方式实现遍历,在对树实现层次操作的时候,要求
用循环队列的操作方式来实现层次遍历。此次课程设计对数据结构容综合性的运
用的要求较高。
关键词:二叉树,先序遍历,中序遍历,后序遍历,层次遍历,节点,线性存储, 节点的孩子信息
目录
课程设计任务书 (1)
一、需求分析 (4)
1.问题描述 (4)
2.功能要求 (4)
二、概要设计 (5)
1.总体设计图 (5)
2.数据结构设计 (5)
3.算法设计 (5)
4.主要模块及模块之间的关系 (5)
三、详细设计 (6)
1.结构体(或类)设计 (6)
2. 主要模块实现的流程图 (6)
3.算法设计 (7)
四、测试运行 (8)
1.登录和主界面运行效果图 (8)
2.运行说明 (8)
3. 运行效果图 (8)
五、结论与心得 (10)
1.总体评价 (10)
2.所做的工作及体会 (10)
六、程序附录(源代码) (12)
七、参考文献 (18)
一、需求分析
1.问题描述
设计一个二叉树。二叉树形象地说即树中每个节点最多只有两个分支,它是一种重要的数据类型。可以运用于建立家谱,公司所有的员工的职位图,以及各种事物的分类和各种机构的职位图表等。二叉树是通过建立一个链式存储结构,达到能够实现前序遍历,中序遍历,后序遍历,层次遍历。以及能够从输入的数据中得知二叉树的叶子结点的个数,二叉树的深度。在此,二叉树的每一个结点中必须包括:值域,左指针域,右指针域。我们抽象出下列问题:实现文件操作,运用文件输入流,将已经写好二叉树序列的txt文本文件,加载到程序中,实现文件创建二叉树。然后采用链表存储的方式遍历二叉树(先序遍历、中序遍历、后序遍历、层次遍历)。层次遍历运用循环队列的方法实现,需要重新定义队头和队尾,以及队列的最大长度,并且在屏幕上实现输出显示。
2.功能要求
(1)用菜单的形式实现操作界面,提供(1—4)个功能选项,功能分别为创建二叉树、遍历序列、节点的孩子信息、退出系统。
(2)创建二叉树。要求用文件读取和键盘输入两种不同的方式实现二叉树的创建。二级菜单说明,输出创建二叉树的深度及结点数,若失败则有相应提示。
(3)遍历序列。显示先序,中序,后序和层次遍历结果。先序遍历、中序遍历、后序遍历用递归的方法实现遍历。层次遍历,用循环队列的方法实现。
(4)每次实现一项操作之后,要有相应的提示返回菜单。
二、概要设计
1.总体设计图
2.数据结构设计
数据元素为字符,逻辑结构为树形结构,存储结构为二叉链式存储,系统操作的数据元素主要是创建一个二叉树,遍历序列。
3.算法设计
本系统主要用到的算法有先序遍历、中序遍历、后序遍历、层次遍历、创建二叉树和查找节点。从子菜单界面只能返回到主菜单界面,而不是退出程序。4.主要模块及模块之间的关系
运行程序后直接进入“菜单主界面”模块,菜单显示分为4个模块,(1~4)分别为创建二叉树、遍历序列、节点的孩子信息、退出系统。主界面中的各个模块都是独立运行,每完成一项操作后,返回主菜单模块。通过相应定义的函数(外部接口)实现,部数据的改变由模块部完成。
三、详细设计
1.结构体(或类)设计
typedef char TElemType;
typedef struct BiTNode
{
TElemType date;
struct BiTNode *lchild,*rchild; }BiTNode,*BiTree;
2.主要模块实现的流程图
3.算法设计
先序遍历:
void PreOrderTraverse(BiTree T)
{ if(T)
{ cout<
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild); } } 中序遍历:
void InOrderTraver(BiTree T)
{ if(T)
{ InOrderTraver(T->lchild);
cout<
InOrderTraver(T->rchild); } } 后序遍历:
void PostOrderTraver(BiTree T)
{ if(T)
{ PostOrderTraver(T->lchild);
PostOrderTraver(T->rchild);
cout<
层次遍历:
void ccbl(BiTNode *b)
{ BiTNode *p;
BiTNode *q[MaxSize];
int qm,h;
qm=h=-1; h++; q[h]=b;
while(qm != h)
{ qm=(qm+1)%MaxSize; p=q[qm];
printf("%c ",p->date);
if(p->lchild!=NULL)
{ h=(h+1)%MaxSize;
q[h]=p->lchild; }
if(p->rchild!=NULL)
{ h=(h+1)%MaxSize;
q[h]=p->rchild; } } }