完整word版二叉树的遍历课程设计.docx
《完整word版二叉树的遍历课程设计.docx》由会员分享,可在线阅读,更多相关《完整word版二叉树的遍历课程设计.docx(17页珍藏版)》请在冰点文库上搜索。
完整word版二叉树的遍历课程设计
课程设计
课程设计名称:
数据结构课程设计
专业班级:
学生姓名:
学号:
指导教师:
课程设计时间:
数据结构专业课程设计任务书
学生姓名
专业班级
学号
题目
二叉树的遍历
课题性质
A.工程设计
课题来源
D.自拟课题
指导教师
同组姓名
无
主要内容
要求能够输入树的各个结点,并能够输出遍历的遍历序列;分别建立建立二叉树存储结构的的输入函数、遍历序列的函数
任务要求
1.用单链表建树,一个一个的建立
2.你能够实现插入和删除
3.实现先序中序后序递归遍历
4.实现先序中序后序非递归遍历
5.显示出层次遍历的结果
参考文献
谭浩强.C程序设计[M].北京:
清华大学出版社.2005.
数据结构课本,数据结构ppt
审查意见
指导教师签字:
教研室主任签字:
2011年12月10日
说明:
本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页
一、需求分析
1.1课程设计题目、任务及要求
二叉树。
用链表作存储结构
(1)对二叉树作各种遍历,输出结果;
(4)输入元素x,查找二叉树的左孩子,右孩子,如果找到则删除该结点,没有找到就退出,返回错误。
1.2课程设计思想
建立二叉树采用一个一个输入的方式。
对二叉树进中序遍历采用递归函数和非递归函数分别实现多种遍历的方式。
另外还有层次遍历,来充分实现本书对树的遍历。
删除结点函数,采用边查找边删除的方式。
如果没有查找到,则不对树做任何的修改;如果查找到结点则删除。
一、系统总体设计
3.1系统模块划分
二叉树是一种动态树表。
开辟一个空间建立一个节点,逐个加入,逐个建立。
利用查找函数,对数进行插入删除
利用书中所学知识进行各种遍历,包括将所有方法归并在一起,还要建立查看界面一边有系统的视觉效果。
3.2二叉树的生成过程
二叉树的生成,采用逐个建立的方式。
如图
3.3主要功能模块设计
程序主要设计了五个功能:
首先是创建二叉排序树,完成后出现任务菜单,菜单中设计了四个模块:
退出,中序遍历,计算平均查找长度和删除结点。
主函数流程如下:
图3.1.1主函数流程图
4系统详细设计
4.1主函数菜单模块
该模块功能主要是给用户提供清晰的可操作界面,易于人机操作,并能很好的调用其他各模块,使程序更加优化,丝路更加清晰,结构更加明了,提高了程序的实用性。
其算法如下:
voidmain()
{
intn,m=1;
BiTreet;
while(m)
{
menu();
scanf("%d",&n);
switch(n)
{
case1:
{/*初始化*/
intflag;
datatypex;
printf("请输入头结点x:
\n");
scanf("%d",&x);
flag=Initiate(&t,x);
if(flag==1)
printf("\n初始化成功!
");
else
printf("\n初始化失败!
");
break;
}
case2:
{
printf("\n请继续添加结点建立二叉树");/*建树*/
break;
}
case3:
{/*插入结点x作为a的左孩子*/
datatypea,x;/*x作为a的左孩子*/
BiTreeparent=t;
printf("请输入双亲a和左孩子x:
\n");
scanf("%d%d",&a,&x);
parent=Find(parent,a);
parent=InsertL(t,x,parent);
if(parent!
=NULL)
t=parent;
break;
}
case4:
{/*插入结点x作为a的右孩子*/
datatypea,x;/*x作为a的右孩子*/
BiTreeparent=t;
printf("请输入双亲aand右孩子x:
\n");
scanf("%d%d",&a,&x);
parent=Find(parent,a);
parent=InsertR(t,x,parent);
if(parent!
=NULL)
t=parent;
break;
}
case5:
{/*删除结点a的左孩子*/
datatypea;
BiTreeparent=t;
printf("pleaseinputa:
\n");
scanf("%d",&a);
parent=Find(parent,a);
parent=DeleteL(t,parent);
if(parent!
=NULL)
t=parent;
break;
}
case6:
{/*删除结点a的左孩子*/
datatypea;
BiTreeparent=t;
printf("pleaseinputa:
\n");
scanf("%d",&a);
parent=Find(parent,a);
parent=DeleteR(t,parent);
if(parent!
=NULL)
t=parent;
break;
}
case7:
{/*递归先序遍历*/
PreOrder(t);
break;
}
case8:
{/*递归中序遍历*/
InOrder(t);
break;
}
case9:
{/*递归后序遍历*/
PostOrder(t);
break;
}
case10:
{/*层次遍历*/
LevelOrder(t);
break;
}
case11:
{/*先序遍历的非递归实现*/
NRPreOrder(t);
break;
}
case12:
{/*中序遍历的非递归实现*/
NRInOrder(t);
break;
}
case13:
{/*后序遍历的非递归实现*/
NRPostOrder(t);
break;
}
case0:
m=0;
}
}
}
4.2查找模块
该模块是给用户提供查找功能。
其查找过程是:
若二叉排序树为空,则查找失败,结束查找,;否则,将要查找的值与二叉排序树根结点的值进行比较,若相等,则查找成功,结束查找,返回被查找到结点的地址,若不等,则根据要查找的值与根结值的大小关系决定时到根结点的左子树还是右子树中继续查找(查找过程同上),直到查找成功或者查找失败为止。
其算法如下:
BiTreeFind(BiTreeparent,datatypea)
{
BiTreep;
if(parent==NULL)
p=NULL;
elseif(parent->data==a)查找根结点
p=parent;
else
{
p=Find(parent->lchild,a);递归方法查找左孩子
if(p==NULL)
p=Find(parent->rchild,a);递归方法查找右孩子
}
returnp;
}
4.3层次遍历模块
层次遍历是从根结点一个一个从上到下从左到右按顺序遍历出来的,这里我利用队列的先进先出特点,来实现此功效
voidLevelOrder(BiTreebt)
{
BiTreeQueue[MAXNODE];
intfront,rear;
if(bt==NULL)
{
return;
}
front=-1;
rear=0;
Queue[rear]=bt;
while(front!
=rear)
{
front++;
printf("%5d",Queue[front]->data);
if(Queue[front]->lchild!
=NULL)
{
rear++;
Queue[rear]=Queue[front]->lchild;
}
if(Queue[front]->rchild!
=NULL)
{
rear++;
Queue[rear]=Queue[front]->rchild;
}
}//endwhile
4.4中序遍历模块(以中序为例来说明)
遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。
访问结点所做的操作依赖于具体的应用问题。
二叉树共有三个部分组成,即根结点,根结点的左子树,根结点的右子树。
限定以从左至右方式共有三种遍历方式,即前序遍历,中序遍历,后序遍历。
中序遍历的原则:
若被遍历的二叉树为非空,则依次执行如下操作:
A)以中序遍历方式遍历左子树;
B)访问根结点;
C)以中序遍历方式遍历右子树。
其算法如下:
voidInOrder(BiTreebt)递归
{
if(bt==NULL)
return;
InOrder(bt->lchild);
printf("%5d",bt->data);
InOrder(bt->rchild);非递归
}
voidNRPreOrder(BiTreebt)
{
BiTreestack[MAXNODE],p;
inttop;
if(bt==NULL)
{
printf("Treeisempty!
\n");
return;
}
top=-1;
p=bt;
while((p!
=NULL)||(top!
=-1))
{
while(p!
=NULL)
{
printf("%5d",p->data);
if(top==MAXNODE-1)
{
printf("Stackoverflow!
\n");
return;
}/*endif*/
else
{
top++;
stack[top]=p;
}/*endif-else*/
p=p->lchild;
}/*endwhilep*/
p=stack[top];
top--;
p=p->rchild;
}/*endwhilep&&top*/
}
}
5测试结果
建立二叉树为(层次)6482379
先序遍历(递归非递归)
中序遍历(递归和非递归)
后序遍历(递归和非递归)
6总结
通过这次课程设计我也着实又感受了一次编程的乐趣,从中也学到了不少知识。
我在学习运用数据结构编程之前,并没能深刻体会到这一点,直到这次课程设计,我才有所领悟。
这次实验中我也出现过一些错误。
这是我对基本概念二叉树和二叉排序树理解的模糊不清造成的。
我原以为只要采用一个个输入的建立二叉排序树后来在老师的指点下我意识到自己的错误。
不过收获也很不少。
我也发现两者在很多函数上是互通的,只需稍作修改即可移植。
总之,我会继续我的兴趣编写程序的,相信在越来越多的尝试之后,自己会不断进步不断提高的。
参考文献
[1]谭浩强.C程序设计[M].北京:
清华大学出版社.2005.
[2]数据结构课本