数计学院数据结构二叉树遍历课程设计.docx
- 文档编号:5395509
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:16
- 大小:296.57KB
数计学院数据结构二叉树遍历课程设计.docx
《数计学院数据结构二叉树遍历课程设计.docx》由会员分享,可在线阅读,更多相关《数计学院数据结构二叉树遍历课程设计.docx(16页珍藏版)》请在冰豆网上搜索。
数计学院数据结构二叉树遍历课程设计
目录
一.问题描述1
(1)题目:
1
(2)题目内容:
1
二.基本要求1
三.工具/准备工作1
四.分析与实现2
(1)分析:
2
(2)核心算法代码:
2
①构建二叉树:
2
②二叉树的递归先序遍历:
3
③二叉树的递归中序遍历:
4
④二叉树的递归后续遍历:
4
⑤二叉树的节点查找:
5
⑥main函数部分:
6
⑦二叉树的非递归先序遍历:
9
⑧二叉树的非递归中序遍历:
10
⑨二叉树的非递归后序遍历:
11
五.测试与结论13
六.课程设计总结16
一.问题描述
(1)题目:
二叉树的建立和后序遍历的演示。
(2)题目内容:
利用单链表构建二叉树的链式存储,并能输入数据,然后分别用递归与非递归算法实现二叉树的中序遍历与后序遍历。
二.基本要求
(1)建立完整的二叉链表。
基本要求:
(2)程序可以输入数据。
(3)递归中序与后续遍历。
(4)非递归后续遍历
扩展功能:
(1)添加了菜单选择功能
(2)添加了查找功能
(3)补全了三种遍历(递归与非递归)
三.工具/准备工作
(1)二叉树的链式存储结构
(2)二叉树的基本运算
复习参考(3)二叉树的3种递归遍历
(4)二叉树的3种非递归遍历
(5)二叉树的节点查找
系统:
Window7
环境/工具:
软件:
c-free
四.分析与实现
(1)分析:
运用链来指示元素间的逻辑关系,表示一颗二叉树,具有链式存储的特点。
另外,结合递归与非递归的思想算法,实现二叉树的三种遍历。
(2)核心算法代码:
构建二叉树:
voidcreate_tree(intx)
{
bts,p;
intflag=0;
s=(treenode*)malloc(sizeof(treenode));
s->data=x;
s->left=NULL;
s->right=NULL;
if(root==NULL)
{
root=s;
}
else
{
p=root;
while(!
flag)
{
if(x>p->data)
{
if(p->left==NULL)
{
p->left=s;
flag=1;
}
else
p=p->left;
}
else
{
if(p->right==NULL)
{
p->right=s;
flag=1;
}
else
p=p->right;
}
}
}
}
二叉树的递归先序遍历:
voidxianxu(btq)
{
if(q!
=NULL)
{
printf("%4d",q->data);
xianxu(q->left);
xianxu(q->right);
}
}
二叉树的递归中序遍历:
voidzhongxu(btq)
{
if(q!
=NULL)
{
zhongxu(q->left);
printf("%4d",q->data);
zhongxu(q->right);
}
}
二叉树的递归后续遍历:
voidhouxu(btq)
{
if(q!
=NULL)
{
houxu(q->left);
houxu(q->right);
printf("%4d",q->data);
}
}
二叉树的节点查找:
btsearch(bta,intx)
{
btp=NULL;
inti=1;
if(a)
{
if(a->data==x)
returna;
if(a->left)
{
p=search(a->left,x);
i=i++;
}
if(p)
{
returnp;
}
if(a->right)
{
p=search(a->right,x);
i=i++;
}
if(p)
{
returnp;
}
}
returnNULL;
}
main函数部分:
intmain(void)
{
inti,k,x,a,v;
btd;
root=NULL;
printf("\n\t\t*************************************");
printf("\n\t\t*计科本113苏加俊出品*");
printf("\n\t\t*二叉树链式存储*");
printf("\n\t\t*************************************");
printf("\n\t\t*1.递归先序遍历*");
printf("\n\t\t*2.递归中序遍历*");
printf("\n\t\t*3.递归后序遍历*");
printf("\n\t\t*4.查找数据节点*");
printf("\n\t\t*5.退出*");
printf("\n\t\t*************************************");
printf("\n\n");
printf("请输入数据:
\n");
for(i=0;i<5;i++)
{
scanf("%d",&k);
create_tree(k);
}
L=root;
again:
printf("请选择功能:
\t");
scanf("%d",&v);
switch(v)
{
case1:
printf("二叉树的先序遍历:
\n");
xianxu(root);
printf("\n");
break;
case2:
printf("二叉树的中序遍历:
\n");
zhongxu(root);
printf("\n");
break;
case3:
printf("二叉树的后序遍历:
\n");
houxu(root);
printf("\n");
break;
case4:
printf("查找的数据:
\n");
scanf("%d",&x);
d=search(L,x);
if(d==NULL)
printf("没有这个元素\n");
else
printf("查找成功\n");
break;
case5:
gotoexit;
break;
default:
{
printf("对不起,没有这个选项,请重新选择:
\n");
gotoagain;
}
}
point:
printf("\t\t0:
退出1:
继续:
\n");
scanf("%d",&v);
switch(v)
{
case1:
gotoagain;
break;
exit:
case0:
return0;
break;
default:
printf("输入有误请重新输入!
\n");
gotopoint;
break;
}
return0;
}
二叉树的非递归先序遍历:
voidxianxu(treenode*b)
{
treenode*stack[MAXSIZE],*p;
inttop=-1;
if(b!
=NULL)
{
top++;
stack[top]=b;
printf("非递归前序遍历:
\t");
while(top>-1)
{
p=stack[top];
top--;
printf("%d\t",p->data);
if(p->right!
=NULL)
{
top++;
stack[top]=p->right;
}
if(p->left!
=NULL)
{
top++;
stack[top]=p->left;
}
}
printf("\n");
}
}
二叉树的非递归中序遍历:
voidzhongxu(treenode*b)
{
treenode*stack[MAXSIZE],*p;
inttop=-1;
printf("非递归中序遍历:
\t");
if(b!
=NULL)
{
p=b;
while(top>-1||p!
=NULL)
{
while(p!
=NULL)
{
top++;
stack[top]=p;
p=p->left;
}
if(top>-1)
{
p=stack[top];
top--;
printf("%d\t",p->data);
p=p->right;
}
}
printf("\n");
}
}
二叉树的非递归后序遍历:
voidhouxu(treenode*b)
{
treenode*stack[MAXSIZE],*p;
intsign,top=-1;
printf("非递归后序遍历:
\t");
if(b!
=NULL)
{
do
{
while(b!
=NULL)
{
top++;
stack[top]=b;
b=b->left;
}
p=NULL;
sign=1;
while(top!
=-1&&sign)
{
b=stack[top];
if(b->right==p)
{
printf("%d\t",b->data);
top--;
p=b;
}
else
{
b=b->right;
sign=0;
}
}
}
while(top!
=-1);
printf("\n");
}
}
附:
由于程序只是递归遍历与非递归遍历的算法不一样,实现的代码不一样,但是main函数部分绝大部分是一样的,就不一一列举了。
五.测试与结论
图一创建二叉树,输入数据
图二输入数据后选择功能
图三选择1,2,3功能,实现二叉树三种递归遍历,其间可选择继续或者退出
图四选择4实现查找节点功能
图五若输入没有的功能号,程序将报错并可重新输入
图六非递归的三种遍历,功能与递归的几乎一样
结论:
本次的课程设计能成功的实现老师要求程序所具有的功能,并加以改进。
因为递归与非递归的程序运行结果一样,所以在此非递归的程序运行图就不一一截取了。
六.课程设计总结
通过这次的实验,明白了用具有递归功能的程序设计语言就能很方便的实现二叉树递归遍历,二叉树的非递归遍历算法是通过建立栈来实现的。
我不仅写出了二叉树递归与非递归的三种遍历,而且还加入了查找节点与菜单选择功能,使程序更美观,更人性化。
经过此次试验,我发现自己对链式存储与函数的调用这两方面运用的还不是很熟练,同时也明白我还有好东东西没有学习和掌握,以后我会更加的努力的去自我学习,争取能够对一些简单的程序信手拈来。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学院 数据结构 二叉 遍历 课程设计