静静.docx
- 文档编号:4903735
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:21
- 大小:219.26KB
静静.docx
《静静.docx》由会员分享,可在线阅读,更多相关《静静.docx(21页珍藏版)》请在冰豆网上搜索。
静静
内蒙古科技大学
本科生课程设计论文
题目:
数据结构课程设计
——二叉树遍历及应用
学生姓名:
李文静
学号:
1176807345
专业:
计算机科学与技术
班级:
计2011-3班
指导教师:
康懿
2013年5月28日
内蒙古科技大学课程设计任务书
课程名称
数据结构课程设计
设计题目
二叉树的遍历和应用
指导教师
周李涌、康懿、兰孝文
时间
2013.5.15——2013.5.29
一、教学要求
1.掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力
2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能
3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力
4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风
二、设计资料及参数
每个学生在教师提供的课程设计题目中任意选择一题,独立完成,题目选定后不可更换。
二叉树的遍历和应用
以二叉链表表示二叉树,在此基础上实现对二叉树的遍历和应用。
要求设计类(或类模板)来描述二叉树,包含必要的构造函数和析构函数,以及其他能够完成如下功能的成员函数:
v创建二叉树
v输出二叉树
v二叉树的先序、中序、后序遍历
v二叉树的按层遍历
v统计二叉树的叶子结点、计算二叉树的深度
并设计主函数测试该类(或类模板)。
三、设计要求及成果
1.分析课程设计题目的要求
2.写出详细设计说明
3.编写程序代码,调试程序使其能正确运行
4.设计完成的软件要便于操作和使用
5.设计完成后提交课程设计报告
四、进度安排
资料查阅与讨论(1天)
系统分析(2天)
系统的开发与测试(5天)
编写课程设计说明书和验收(2天)
五、评分标准
1.根据平时上机考勤、表现和进度,教师将每天点名和检查
2.根据课程设计完成情况,必须有可运行的软件。
3.根据课程设计报告的质量,如有雷同,则所有雷同的所有人均判为不及格。
4.根据答辩的情况,应能够以清晰的思路和准确、简练的语言叙述自己的设计和回答教师的提问
六、建议参考资料
1.《数据结构(C语言版)》严蔚敏、吴伟民主编清华大学出版社2004.11
2.《数据结构课程设计案例精编(用C/C++描述)》,李建学等编著,清华大学出版社2007.2
3.《数据结构:
用面向对象方法与C++语言描述》,殷人昆主编, 清华大学出版社2007.6
1.功能设计
(1)创建二叉树
利用二叉树模板类,创建二叉树时产生类模板,调用类的构造函数来创建,修改二叉树的结构时,可以调用赋值语句直接把广义表转换成二叉树。
相关类或函数如下:
classBinaryTree;
BinaryTree();
BinaryTree
(2)先序递归遍历
若二叉树为空,则空操作;否则
(1)访问根结点;
(2)先序遍历左子树;(3)先序遍历右子树。
相关函数如下:
voidPreOrderTraverse(constBinaryTreeNode
(3)中序递归遍历
若二叉树为空,则空操作;否则
(1)中序遍历左子树;
(2)访问根结点;(3)中序遍历右子树。
相关函数如下:
voidInOrderTraverse(constBinaryTreeNode
(4)后序递归遍历
若二叉树为空,则空操作;否则
(1)后序遍历左子树;
(2)后序遍历右子树;(3)访问根结点。
相关函数如下:
voidPostOrderTraverse(constBinaryTreeNode
2.算法流程图
(5)创建二叉树
图2-1创建二叉树
(6)先序递归遍历
图2-2前序递归遍历
(7)中序递归遍历
图2-3中序递归遍历
(8)后序递归遍历
图2-4后序递归遍历
3.问题描述
[题目]建立二叉树并先序、中序、后序、层次遍历、深度、叶子个数。
[问题描述]
要求能够按先序遍历次序输入二叉树中结点的值来构造二叉树T;然后用递归算法实现二叉树T的先序遍历,中序遍历,后序遍历,按层次遍历,;接着编写算法实现求二叉树T中指定结点的路径,即从键盘输入二叉树T的任一结点,可以输出从根结点到该结点所经历的结点;最后编写二叉树的二个应用算法(求二叉树的深度、求二叉树的叶子结点个数)。
[基本要求]
分别建立二叉树存储结构的输入输出函数、输出,先序遍历,中序遍历,后序遍历,按层次遍历函数、指定节点路径函数、求深度函数、叶子结点个数函数。
一、需求与规格说明
1、定义二叉树的存储结构,每个结点中设置三个域,即值域、左指针域、右指针域。
要建立二叉树T的链式存储结构,即建立二叉链表。
根据输入二叉树结点的形式不同,建立的方法也不同,本系统采用先序序列递归建立二叉树,建立如下图所示的二叉树。
应该在程序运行窗口的主控菜单后,先选择“1”并回车,紧接着在程序运行窗口中提示信息“输入二叉树的先序序列结点值:
”之后,采用以下字符序列:
abc@@de@g@@f@@@(以@替代空格,但是程序中直接输入空格就是,详细见代码注释)作为建立二叉树T的输入字符序列并回车,窗口出现:
二叉树的链式存储结构建立完成!
图1二叉树的图形结构
2、二叉树的遍历。
本系统采用递归中序遍历算法进行遍历,需要在程序运行窗口的主控菜单中选择“2”并回车,程序运行窗口会出现以下中序遍历序列:
该二叉树的先序、中序、后序、层次遍历序列是:
abcdegfcbegdfacgefdbaabcdefg
3、求二叉树的深度。
在程序运行窗口的主控菜单中选择“4”并回车,在会得到结果为:
该二叉树的深度为:
5
4、求二叉树的叶子结点个数。
在程序运行窗口的主控菜单中选择“5”并回车,在会得到结果为:
该二叉树的叶子结点数为:
3
5、退出程序。
在程序运行窗口的主控菜单中选择“0”并回车。
退出程序。
4.详细设计
(1)设计思想
创建二叉树,采用递归算法进行先序、中序、后序、层次遍历,以及求解二叉树的深度,和树的叶子数。
(2)设计表示
为实现上述的设计思想,首先要定义二叉树的链式存储结构,我们采用二叉链表的方式,相应的类型说明为:
classBiTNode//二叉树的二叉链表存储
{
public:
chardata;
BiTNode*lchild,*rchild;
public:
BiTNode()
{
data=NULL;
lchild=NULL;
rchild=NULL;
}
~BiTNode()
{}
};
typedefBiTNode*BiTree;
(3)函数接口说明:
intCreateBiTree(BinTree&T)//1.按照先序遍历次序递归建立二叉树
intPreOrder(BiTreeT);//2.二叉树递归中序遍历算法
intInorder(BinTreebt)//3.二叉树递归中序遍历算法
intPostOrder(BiTreeT);//4.二叉树递归中序遍历算法
intLevelTravel(BiTreeT);//5.二叉树递归中序遍历算法
intDepth(BinTreeT)//6.求二叉树的深度
intLeaf(BinTreeT)//7.求二叉树的叶子结点个数
(4)函数调用关系如图所示:
(5)实现注释
二叉树的创建模块:
按照先序遍历次序递归建立二叉树,通过读入的字符,分配存储空间生成新结点后再逐个构建根结点、左子树和右子树。
二叉树先序遍历模块:
采用递归先序遍历算法,先逐步扫描二叉树的根结点,然后扫描左子树,如果左子树为空,然后再扫描右子树,然后再重复上面的步骤扫描该分支的左子树,直至整棵二叉树都扫描完成。
此时输出的序列便是该二叉树的先序遍历序列。
语句注释见代码。
二叉树中序遍历模块:
采用递归中序遍历算法,先逐步扫描二叉树的左子树,如果左子树为空,然后根结点,然后再扫描右子树,然后再重复上面的步骤扫描该分支的左子树,直至整棵二叉树都扫描完成。
此时输出的序列便是该二叉树的中序遍历序列。
语句注释见代码。
二叉树后序遍历模块:
采用递归后序遍历算法,先逐步扫描二叉树的左子树,如果左子树为空,然后再扫描右子树,然后根结点,然后再重复上面的步骤扫描该分支的左子树,直至整棵二叉树都扫描完成。
此时输出的序列便是该二叉树的后序遍历序列。
语句注释见代码。
求二叉树的深度模块:
通过判断左右孩子结点是否存在,如存在(h不等于零),则有一个孩子h加一,然后比较左右孩子结点数大小,较大的为树的深度。
具体见代码。
求二叉树的叶子结点个数模块:
判断左右子树的叶子结点是否存在,如存在,则记下,左后返回左右子树叶子结点的和。
具体见代码。
(6)调试报告
编程的最初阶段,在case4语句中,缺少break,使得每次执行case4的时候,自动弹出该二叉树的叶子节点数,经过调试后发现,原来是缺少了break,补上之后,程序正常运行。
其实这只是很小的问题!
在调试中,还有很多的问题,如果在这里一一列举,恐怕很难写完。
具体的看运行结果
5.运行结果截图
二叉树的创建:
图表2
二叉树的遍历结果:
图表3
二叉树的深度:
图表4
二叉树的叶子结点数:
图表5
6.总结
(1)心得体会
在课程设计这一期间,遇见一些重要的问题,其中的一些小的问题,通过上网查询和讨论以及询问同学不算太难,但是其中一个就是怎样后序非递归遍历二叉树,经过一番试探,以及仔细的分析和斟酌,最后终于得到一个令人比较满意的程序,使得每一次的编译都能保留上一次的结果,使得这个程序变得有一点意义,更接近于现实的应用。
另外,还有一些怎样去查找或者删除程序也同样不容易。
针对任何程序算法是不可忽略的,但是有一些关键词也是很重要的,他们在其中也起着决定性的作用。
总之遇到问题则会共进退。
这一次的课程设计给我们提供了一个既能动手又动脑,独立实践的机会,我们就应该紧紧抓住这个机会把我们的所学的专业课程进一步的巩固和加深,进一步培养我们的综合能力。
灵活运用各种数据类型组成一个具有系统性的程序。
我们的任务就是提高、提高、再提高…
对于选择这个题目,起初,我们没有一点头绪,经过查阅各种资料和上网查询,以及多方面的了解,认识由浅入深,慢慢的形成一个轮廓,头脑逐渐清晰,虽然头脑渐渐地浮现一些新颖问题,但是就因为这样反复的解决新问题,学到了许多以前忽略的小问题小细节,同时因为这也使我们思考的深度增加了许多,许多零碎知识的积累也越来越接近质的变化,总之是获益匪浅。
同时这次的课程设计也让我们知道学习不仅要学份内的东西,还要学习一些对我们的能力有很大提高的事情;不仅要牢牢掌握基础知识,还要有所偏爱有所研究,并且还要多看书拓展自己的知识面。
多一些勤奋,少一些懒惰,或许以后就可以少受十倍的罪。
早期的鸟儿有食吃,笨鸟先飞,只有现在加强自己的训练,相信不久的将来,肯定有一块不错的天空供自己飞翔。
在这之中,虽然每个人的思路不一样,但是合作就该有合作的诚意,只有合理的分工,拿一颗真诚热心去探讨问题才能更好的解决问题,这样的合作会使我们的效果更上一层楼。
开心的合作,愉快的交谈,问题不再迷茫,一起解决问题,成功会因合作而发芽,会因合作而有深意。
(2)参考文献:
[1]严蔚敏,吴伟民.数据结构(C语言版).北京:
清华大学出版社,2010
[2]严蔚敏,吴伟民等.数据结构题集(C语言版).北京:
清华大学出版社,2010
[3]苏仕华等.数据结构程设计.北京:
机械工业出版社,2008
7.程序清单
#defineok1//函数结果状态代码
#defineerror0
#defineOVERFLOW-1
#defineSTACKCRE10
#include
#include
#include
#include
classBiTNode//二叉树的二叉链表存储
{
public:
chardata;
BiTNode*lchild,*rchild;
public:
BiTNode()
{
data=NULL;
lchild=NULL;
rchild=NULL;
}
~BiTNode()
{}
};
typedefBiTNode*BiTree;
classBT
{
private:
BiTreeroot;
public:
BT()
{
root=NULL;
}
~BT()
{}
intCreateBiTree(BiTree&T);//voidPrint(BiTreeT);
intPreOrder(BiTreeT);
intInOrder(BiTreeT);
intPostOrder(BiTreeT);
intLevelTravel(BiTreeT);
intBiTreeDepth(BiTreeT);
intLeaf(BiTreeT);
};
intBT:
:
CreateBiTree(BiTree&T)//创建二叉树
{//按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树
//构造二叉链表表示的二叉树T
charch;
ch=getchar();
if(ch=='')T=NULL;
else{
if(!
(T=(BiTNode*)malloc(sizeof(BiTNode))))exit(OVERFLOW);
T->data=ch;//生成根结点
CreateBiTree(T->lchild);//构造左子树
CreateBiTree(T->rchild);//构造右子树
}
returnok;
}
//voidBT:
:
Print()
intBT:
:
PreOrder(BiTreeT)//先序遍历
{
if(T!
=NULL){
cout<
PreOrder(T->lchild);
PreOrder(T->rchild);
}
returnok;
}
intBT:
:
InOrder(BiTreeT)//中序遍历
{
if(T!
=NULL){
InOrder(T->lchild);
cout<
InOrder(T->rchild);
}
returnok;
}
intBT:
:
PostOrder(BiTreeT)//后序遍历
{
if(T!
=NULL){
PostOrder(T->lchild);
PostOrder(T->rchild);
cout<
}
returnok;
}
intBT:
:
LevelTravel(BiTreeT)//按层遍历
{
BiTreeq[20];
intrear=0,front=0;
BiTreep;
if(T)
{
q[rear]=T;
rear=(rear+1)%20;
}
while(rear!
=front)
{
p=q[front];
front=(front+1)%20;
cout<
if(p->lchild)
{
q[rear]=p->lchild;
rear=(rear+1)%20;
}
if(p->rchild)
{
q[rear]=p->rchild;
rear=(rear+1)%20;
}
}
returnok;
}
intBT:
:
BiTreeDepth(BiTreeT)//求二叉树的深度(后序遍历)
{
inth1,h2;
if(T==NULL)return0;
else{
h1=BiTreeDepth(T->lchild);
h2=BiTreeDepth(T->rchild);
returnh1>h2?
h1+1:
h2+1;
}
}
intBT:
:
Leaf(BiTreeT)//求二叉树的叶子数(先序遍历)
{
if(!
T)return0;
elseif(!
T->lchild&&!
T->rchild)
{
cout<
return1;
}
elsereturn(Leaf(T->lchild)+Leaf(T->rchild));
}
intmain()
{
BiTNode*C;
BTfirst;
cout<<"创建二叉树:
"< first.CreateBiTree(C); inti; while(i) { cout<<"\t\t\t数据结构课程设计---二叉树的遍历与应用"< cout<<"\t\t\t---------------------------------------------------"< cout<<"\t\t\t1: 先序、中序、后序、层序遍历二叉树: "< cout<<"\t\t\t2: 二叉树的深度: "< cout<<"\t\t\t3: 二叉树的叶子结点数: "< cout<<"\t\t\t0: 结束退出程序"< cout<<"\t\t\t----------------------------------------------------"< cout<<"\t\t\t请选择: "; cout<<"\n\n\n\n\n\n"; cin>>i; switch(i) { case1: cout<<"先序、中序、后序、层序遍历分别为: "< first.PreOrder(C); cout< first.InOrder(C); cout< first.PostOrder(C); cout< first.LevelTravel(C); cout< break; case2: cout<<"二叉树的深度: "< cout< cout< break; case3: cout<<"二叉树的叶子结点数: "< cout< cout< break; case0: cout<<"\n\n(*^__^*)李文静计算机11-3班学号: 1176807345\n\n\n"< break; } } returnok; } 目录 1.功能设计1 (1)创建二叉树1 (2)先序递归遍历1 (3)中序递归遍历1 (4)后序递归遍历1 2.算法流程图2 (1)创建二叉树2 (2)先序递归遍历3 (3)中序递归遍历4 (4)后序递归遍历5 3.问题描述6 (1)设计思想7 (2)设计表示7 (3)函数接口说明: 8 (4)函数调用关系如图所示: 8 (5)实现注释9 (6)调试报告10 5.运行结果截图10 6.总结12 (1)心得体会12 (2)参考文献: 13 7.程序清单14 致谢 感谢我的老师们,他们严谨细致、一丝不苟的作风一直是我工作、学习中的榜样。 感谢同学们对我的帮助和指点。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 静静
![提示](https://static.bdocx.com/images/bang_tan.gif)