二叉树的建立及其应用Word格式.docx
- 文档编号:20036716
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:14
- 大小:212.91KB
二叉树的建立及其应用Word格式.docx
《二叉树的建立及其应用Word格式.docx》由会员分享,可在线阅读,更多相关《二叉树的建立及其应用Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
二需求分析
2.1程序设计的目的
掌握二叉树的概念和性质、任意二叉树存储结构和任意二叉树的基本操作,并会求二叉树的高度、二叉树总结点个数、二叉树叶子结点,以及熟练掌握三种遍历,包括前序遍历、中序遍历、后序遍历。
2.2程序设计的基本要求
在设计程序时,一定要简单明了,程序设计的思想要完善,算法要清晰,能给其他读者一目了然的感觉。
实现二叉树的建立;
前序、中序和后序遍历;
高度、总结点数、叶子结点数。
三程序设计的内容及详细设计
3.1算法设计的思想
二叉树的建立基本思想是:
依次输入的结点信息,若输入的结点不是虚结点,则建立一个新结点。
若新结点是第一个结点,则令其为根结点;
否则将新结点作为孩子链接到它的双亲结点上。
如此重复下去,直至输入“00”时为止。
可设置一个指针类型的数组队列,保存已输入结点的地址。
由于是按层次自左至右输入结点的,所以先输入的结点的孩子必定比后输入结点的孩子先进入队列,因此可利用对头指针指向当前必须与其孩子结点必定建立链接的双亲结点,利用队尾指针指向当前的结点,即是当前必须与其双亲建立链接的双亲结点。
若队尾指针为偶数,则表示当前输入的结点编号是偶数,队尾指针所指向的结点应作为左孩子与其双亲链接;
否则队尾指针所指的结点应作为右孩子与其双亲链接。
若双亲结点或孩子结点或孩子结点为虚结点,则无须链接。
若双亲结点与其两个孩子链接完毕,则做出队操作,使队头指针指向下一个等待链接的双亲结点。
遍历二叉树是二叉树的一种重要的运算,所谓遍历是指沿某条搜索路径周游二叉树,对数中每个结点访问一次且仅访问一次。
二叉树的定义是递归的,所以主要由三种遍历方案:
1.前序遍历二叉树
若二叉树非空,则依次进行如下操作:
(1)访问根结点;
(2)前序遍历左子数;
(3)前序遍历右子树。
2.中序遍历二叉树
(1)中序遍历左子树;
(2)访问根结点;
(3)中序遍历右子树。
3.后序遍历二叉树
(1)后序遍历左子树;
(2)后序遍历右子树;
(3)访问根结点。
一个结点的子树个数称为该结点的度。
一颗树的度是该树中结点的最大度数。
度为零的结点称为叶子,二叉树结点的层数是从根开始算起的,树中结点的最大层数称为树的高度或深度。
3.2程序设计流程图
3.3.程序数据类型
typedefintdatatype;
/*datatype可以为任何类型,这里假设为int*/
#definemax60/*二叉树可能的最大长度,这里假设为60*/
typedefstructnode
{/*结构体*/
chardata;
/*数据域*/
structnode*lchild,*rchild;
/*左右孩子指针*/
}bitree;
3.4程序模块分析
(1)二叉树的建立
bitree*creat()/*二叉树的建立*/
{
inti,j;
bitree*root,*s,*Q[max];
charch;
printf("
请输入要建立的树的下标和数值:
"
);
scanf("
%d%c"
&
i,&
ch);
while(i!
=0&
ch!
='
0'
)
{
s=(bitree*)malloc(sizeof(bitree));
s->
data=ch;
lchild=NULL;
rchild=NULL;
Q[i]=s;
if(i==1)root=s;
else
{
j=i/2;
if(i%2==0)Q[j]->
lchild=s;
elseQ[j]->
rchild=s;
}
scanf("
}
returnroot;
}
(2)二叉树的三种遍历
voidpreorder(bitree*t)/*前序遍历*/
if(t)
printf("
%c"
t->
data);
preorder(t->
lchild);
rchild);
voidinorder(bitree*t)/*中序遍历*/
inorder(t->
voidpostorder(bitree*t)/*后序遍历*/
postorder(t->
(3)求二叉树的高度
inthigh(bitree*t)/*求二叉树的高度*/
intl,r;
if(t==NULL)return0;
else
l=high(t->
r=high(t->
return(l>
r?
l:
r)+1;
(4)求二叉树的总结点数
intnodes(bitree*a)/*求总结点数*/
intnum1,num2;
if(a==NULL)return0;
num1=nodes(a->
num2=nodes(a->
returnnum1+num2+1;
(5)求叶子结点数
intleafs(bitree*b)/*求叶子结点数*/
intn,m;
if(b==NULL)return0;
else
if(b->
lchild==NULL&
b->
rchild==NULL)return1;
n=leafs(b->
m=leafs(b->
returnn+m;
(6)主函数main(),功能是给出测试数据值,建立测试数据值的顺序表,调用creat函数、preorder函数、inorder函数、postorder函数high、函数nodes函数、leafs函数实现问题要求。
3.5主要的算法源代码
#include"
stdio.h"
/*头文件*/
#include<
malloc.h>
#definemax60
typedefstructnode
bitree*creat()/*二叉树的建立*/
inti,j;
请输入要建立的树的下标和数值:
inthigh(bitree*t)/*求二叉树的高度*/
voidmain()
inta,j,h,g;
bitree*b;
b=creat();
while
(1)
选择1前序遍历\n选择2中序遍历\n选择3后序遍历\n选择4求高度\n选择5求总结点数\n选择6求叶子结点个数\n选择0退出:
"
scanf("
%d"
a);
switch(a)
case1:
printf("
该二叉树的前序遍历是:
preorder(b);
printf("
\n"
break;
case2:
该二叉树的中序遍历是:
inorder(b);
case3:
该二叉树的后序遍历是:
postorder(b);
case4:
该二叉树的高度j=%d\n"
j);
j=high(b);
case5:
h=nodes(b);
该二叉树的总结点数h=%d\n"
h);
case6:
g=leafs(b);
该二叉树的叶子结点个数g=%d\n"
g);
case0:
return;
3.6程序设计的结果
1.建立二叉树如下图:
2.测试提示:
输入数据1A2B3C4D5E7J10F11G14K15L22H23I00
2.前序遍历功能运行结果如下图:
3.中序遍历功能运行结果如下图:
4.后序遍历功能运行结果如下图:
5.求高度功能运行结果如下图:
6.求总结点数功能运行结果如下图:
7.求叶子结点个数功能运行结果如下图:
8.程序运行结束如下图:
四程序设计的优缺点及遇到问题
4.1程序设计的优缺点
这个程序设计的算法清晰,思想明了,能清楚的实现二叉树的建立、三种遍历、高度、总结点数以及叶子结点数的运算。
但是这个程序在设计过程时有些麻烦,而且三种遍历的算法自己不是太清楚,不能很清楚的描述三种遍历。
4.2程序设计遇到的问题
在设计时主要三种遍历不是很清楚,所以还是很模糊,刚开始不能很准确的把三种遍历的算法写出来,所以在这个问题上还要继续思考。
在写菜单时不是很了解,后来在同学的帮助下把程序的菜单写出来了,自己还要加强这方面的练习。
五程序设计的心得体会
5.1心得体会
通过这次做数据结构的课程设计,我发现真正掌握一个知识点并不只是要从书上看,还要查一些相关资料,并且理论与现实结合在一起。
这次做的是关于二叉树的课程设计,刚开始以为并不是很难,但真正做的时候才发现这一节的知识点很多,也有一些比较混淆的难点,比如二叉树的遍历就有三种情况,包括前序遍历、中序遍历、后序遍历。
另外通过这次设计,我感到团队协作真的非常重要,当一个程序出现错误时,一个人找半天也找不出来,但通过讨论,上网查资料,大家的观点结合在一块,通过分析就找了出来。
当程序调试通过时,感到非常高兴,有一种小成就感,这就是合作的乐趣吧。
通过这次合作,感到时间过得很充实,对这门课的兴趣也大大提高了。
当然这次在做课程设计的时候也遇到一些问题,不过还好得到了同学们的无私帮助,问题得以解决,从而成功的完成了本次的课程设计。
第六章参考文献
【1】耿国华.数据结构—C语言描述。
2005年7月第1版.高等教育出版社。
【2】何钦铭颜晖,C语言程序设计。
2008年1月第1版。
高等教育出版社。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉 建立 及其 应用
![提示](https://static.bdocx.com/images/bang_tan.gif)