二叉树结点的左右子树交换课程设计报告Word文件下载.docx
《二叉树结点的左右子树交换课程设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《二叉树结点的左右子树交换课程设计报告Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。
该功能流程图(图2-1)如下:
三详细设计
本课题为二叉树结点的左、右子树的交换,主要分为三个模块:
各模块的详细设计如下:
首先定义结构体类型及二叉树结点类型,如下所示:
typedefchardatatype;
//树的结点数据类型为字符型,可以根据需要修改
typedefstructnode*pointer;
//定义二叉树结点类型
structnode{
datatypedata;
//结点数据
pointerlchild,rchild;
//左右孩子结点
};
三个模块各写三个函数,分别如下所示:
bitreelevel_creat()//由层次序列建立二叉树,返回根指针
{
charch;
ch=cin.get();
intfront,rear;
pointerroot,s;
root=NULL;
//置空二叉树
front=rear=0;
//置空队列
//while(cin>
>
ch,ch!
='
!
'
)
while(cin>
{
if(ch!
@'
)//非虚结点,建立新结点
{
s=newnode;
s->
data=ch;
lchild=s->
rchild=NULL;
}
elses=NULL;
rear++;
Q[rear]=s;
//不管结点是否为虚都要入队
if(rear==1){root=s;
front=1;
}//第一个点是根,要修改头指针,他不是孩子
elseif(s&
&
Q[front])//孩子和双亲都不是虚结点
if(rear%2==0)Q[front]->
lchild=s;
//rear是偶数,新结点是左孩子
else
{
Q[front]->
rchild=s;
//rear是奇数,新结点是右孩子
front++;
}
}
returnroot;
}
voidexchange(bitreet)//交换左右子数函数
pointerp;
if(t==NULL)return;
//空树,直接返回
p=t->
lchild;
t->
lchild=t->
rchild;
rchild=p;
//交换
exchange(t->
rchild);
//遍历原左子树
lchild);
//遍历原右子树
voidpreorder(bitreet)//先根遍历函数
if(t==NULL)
return;
cout<
<
t->
data<
"
"
;
//先访问跟
preorder(t->
//先根遍历左子树
//先根遍历右子树
flag=1;
四调试分析和测试结果
本人主要编写main()函数及先根遍历函数,主函数还是比较简单,就是先根遍历函数有一个小问题:
输入的的第一个树即根结点始终打印不出来,分析代码,也没发现什么错误,比较纠结。
下面是测试结果截图:
图4-1为程序运行首页。
图4-1
图4-2为输入二叉树结点的界面。
图4-2
图4-3为操作菜单。
图4-3
图4-4为左右二叉树交换成功。
图4-4
图4-5为先根遍历输出结果。
图4-5
五总结
在刚选到该课题的时候,感觉挺茫然的,不知从何处入手。
毕竟一个寒假过来,上学期学的数据结构知识也忘的差不多了,并且学的也不是很扎实,所以感觉无从下手。
在队友的相互帮助下,我们开始加紧的看书,去图书馆借资料以及上网进行搜索相关的资料,并慢慢的开始做起来。
我们这组三人,分工也比较明确,各自主要负责自己的模块。
二本人负责先序遍历模块以及主函数的的编写。
在编码过程中,我们遇到了很多小问题,以及一些因粗心而造成的错误,我们都一一解决了。
只是我这个环节还有一个问题没有得到解决,就是输出先根遍历的结果时根节点没输出来。
这个问题困扰我两天,一直没有得到解决。
这个需要以后再继续学习、探究。
总的来说,由于时间有限,本次课程设计“马马虎虎”地完成了。
从理论到实践,在整整一个星期的日子里,我学到很多很多的东西,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的内容。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才是真正的知识,才能提高自己的实际动手能力和独立思考的能力。
六参考文献
1.严蔚敏吴伟明数据结构(C语言版)--清华大学出版社
2.csdn论坛网址:
七致谢
完成该课题的设计,离不开队友的相互配合、同学的帮助及老师的指导,在此表示十分感谢!
八附录
//源代码
#include<
iostream>
#include<
process.h>
conio.h>
usingnamespacestd;
/*二叉树类型的定义(二叉链表形式储存)*/
typedefpointerbitree;
//定义二叉树类型
/*先根遍历交换左右子树*/
/*层次遍历序列生成*/
constintmaxsize=100;
intflag=0;
pointerQ[maxsize+1];
/*交换左右子数*/
voidexchange(bitreet)
/*二叉树的先根遍历*/
voidpreorder(bitreet)//先根遍历
/*voidstop()
//cout<
\n按任意键继续:
getch();
}*/
voidmain()
bitreeT=NULL;
intch;
首先层次遍历序列生成二叉树,请输入结点数据(输入'
为虚结点,输入'
结束):
\n"
T=level_creat();
if(T==NULL)
cout<
\n\n\t\t二叉树生成失败!
\n按任意键返回菜单:
getch();
else
\n\n\t\t二叉树生成成功!
AA:
do{
system("
cls"
);
//调用清屏函数
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓"
┃二叉树左右子树交┃"
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫"
┃\t\t1.重新建立二叉树┃"
┃\t\t2.交换左右子数┃"
┃\t\t3.先根遍历二叉树┃"
┃\t\t0.退出┃"
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛"
\t\t请选择数字(0-3):
cin>
ch;
switch(ch)
case0:
break;
case1:
system("
cout<
getch();
break;
case2:
exchange(T);
\n\n\t\t左右子树交换成功!
case3:
\n先根遍历二叉树结果:
preorder(T);
if(flag)
{
cout<
\n\n按任意键返回菜单:
getch();
}
cout<
endl;
default:
cout<
\n\n\t\t您输入错误!
请重新输入:
\n\n"
gotoAA;
}while(ch!
=0);