实验 三二叉树的基本操作实现及其应用.docx
- 文档编号:10467968
- 上传时间:2023-02-13
- 格式:DOCX
- 页数:13
- 大小:245.77KB
实验 三二叉树的基本操作实现及其应用.docx
《实验 三二叉树的基本操作实现及其应用.docx》由会员分享,可在线阅读,更多相关《实验 三二叉树的基本操作实现及其应用.docx(13页珍藏版)》请在冰豆网上搜索。
实验三二叉树的基本操作实现及其应用
数
据
结
构
实
验
报
告
(三)
**********
学院:
计算机学院
班级:
软件114班
实验三二叉树的基本操作实现及其应用
一、实验目的
1.熟悉二叉树结点的结构和对二叉树的基本操作。
2.掌握对二叉树每一种操作的具体实现。
3.学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法。
4.会用二叉树解决简单的实际问题。
二、实验内容
题目一设计程序实现二叉树结点的类型定义和对二叉树的基本操作。
该程序包括二叉树结构类型以及每一种操作的具体的函数定义和主函数。
1按先序次序建立一个二叉树,
2按(A:
先序B:
中序C:
后序D:
层序)遍历输出二叉树的所有结点
以上比做,以下选做
3求二叉树中所有结点数
4求二叉树的深度
****************************************************************
/*定义DataType为char类型*/
typedefcharDataType;
/*二叉树的结点类型*/
typedefstructBitNode
{DataTypedata;
structBitNode*lchild,*rchild;
}*BitTree;
相关函数声明:
1、/*初始化二叉树,即把树根指针置空*/
voidBinTreeInit(BitTree&BT)
2、/*按先序次序建立一个二叉树*/
voidBinTreeCreat(BitTree&BT)
3、/*检查二叉树是否为空*/
intBinTreeEmpty(BitTreeBT)(包括按、中序、后序、按层次)
4、/*按任先序遍历次序输出二叉树中的所有结点*/
voidperordertraverse(BitTreeT)
5、/*按任中序遍历次序输出二叉树中的所有结点*/
voidinordertraverse(BitTreeT)
6、/*按任后序遍历次序输出二叉树中的所有结点*/
voidenordertraverse(BitTreeT)
7、/*按任层序遍历次序输出二叉树中的所有结点*/
voidcengordertraverse(BitTreeT)
8、/*求二叉树的深度*/
intBinTreeDepth(BitTreeBT)
9、/*求二叉树中所有结点数*/
intBinTreeCount(BitTreeBT)
相关函数的实现:
1、/*初始化二叉树,即把树根指针置空*/
voidBinTreeInit(BitTree&BT)
{if(!
(BT=(BitNode*)malloc(sizeof(BitNode))))
exit(0);//为树根指针申请空间,申请不到退出。
BT=NULL;}//把树根指针置空,完成初始化。
2、/*按先序次序建立一个二叉树*/
voidBinTreeCreat(BitTree&BT)//递归调用建立二叉树
{charch;ch=getchar();//输入字符。
if(ch=='')BT=NULL;//空格代表为空
else{//递归建立二叉树。
if(!
(BT=(BitNode*)malloc(sizeof(BitNode))))
exit(0);//为节点申请空间,申请不到退出。
BT->data=ch;//为节点赋值
BinTreeCreat(BT->lchild);//先建立左二叉树。
BinTreeCreat(BT->rchild);}//再建立右二叉树。
}
3、/*检查二叉树是否为空*/
intBinTreeEmpty(BitTreeBT)
{if(BT)return0;//根节点不空,二叉树就不空。
返回0
return1;}//否则二叉树就为空,则返回1
4、/*按任先序遍历次序输出二叉树中的所有结点*/
按递归的方法实现的遍历。
(中序,后序遍历与此相同略)
voidperordertraverse(BitTreeT)//二叉树存在时。
{if(T){printf("%c",T->data);//访问节点的值,把节点的值输出
perordertraverse(T->lchild);//递归调用访问左节点
perordertraverse(T->rchild);}//递归调用访问右节点
}
5、/*按任层序遍历次序输出二叉树中的所有结点*/
层遍历运用到了STL里的队列。
//注:
前面定义一个队列queue
voidcengordertraverse(BitTreeT)
{BitNode*p;//定义一个节点。
if(T){//二叉树不空时。
m.push(T);//把节点放入队列中。
while(!
m.empty()){//队列不空时。
p=m.front();m.pop();//访问头结点的值,并把头结点出队
printf("%c",p->data);
if(p->lchild)m.push(p->lchild);//左孩子不空时把左孩子入队。
if(p->rchild)m.push(p->rchild);}//右孩子不空时把右孩子入队。
}
}
6、/*求二叉树的深度*/
intBinTreeDepth(BitTreeBT)//运用递归求二叉树的深度。
{inta,b,count;//count用来记二叉树的深度
if(BT==NULL)count=0;//二叉树为空时,二叉树的深度为0。
else{a=BinTreeDepth(BT->lchild);//递归调用求左子树的深度。
b=BinTreeDepth(BT->rchild);//递归调用求右子树的深度。
if(a>b)count=a+1;//树的深度为左右子树中最深的加1。
elsecount=b+1;}
returncount;//返回二叉树的高度。
}
7、/*求二叉树中所有节点数*/
intBinTreeCount(BitTreeBT)//运用递归求二叉树的节点数。
{intcount=0,a,b;//count用来记二叉树的节点数
if(BT==NULL)count=0;//二叉树为空时节点数为0
else{a=BinTreeCount(BT->lchild);//递归左子树的节点数
b=BinTreeCount(BT->rchild);//递归右子树的节点数
count=a+b+1;}//二叉树树的节点数为左右子树的节点数之和再加1
returncount;//返回二叉树的节点数。
}
8./*主界面让界面看起来更美观*/
voidzhujiemian()
{cout< cout<<"\t\t\t\t数据结构实验三"< cout<<"\t\t----------------------------------------------"< cout<<"\t\t1初始化二叉树"< cout<<"\t\t2按先序次序建立二叉树"< cout<<"\t\t3判断二叉树是否为空"< cout<<"\t\t4遍历二叉树"< cout<<"\t\t5求二叉树的深度"< cout<<"\t\t6求二叉树中所有结点数"< cout<<"\t\t其他键退出"< cout<<"\t\t----------------------------------------------"< cout<<"\t请选择要进行操作的序号(1--6): "; }三、程序调试及运行结果分析: 1、主界面和初始化结果,运行结果如图。 2、建立如图所示二叉树 输入hda(空格)(空格)c(空格)b(空格)(空格)gf(空格)e(空格)(空格)(空格) 运行结果如图: 3、遍历二叉树,运行结果如图: 4、求二叉树的深度,运行结果如图: 5、求二叉树的节点数,运行结果如图: 四、实验总结: 通过这次实验我基本掌握了有关二叉树的基本操作。 例如二叉树的建立,二叉树的先序、中序、后序和层序的遍历,二叉树的深度,二叉树的节点数。 这些有关二叉树的操作大都是利用递归实现的。 通过这次实验不仅掌握了二叉树的基本操作而且还熟练了有关递归算法的操作,因此对递归算法有了更深的理解,还明白了递归算法的实现的原理和过程。 通过这次实验的二叉树层序遍历还复习了前面学过的有关关于队列的操作。 学习知识就是学习新知识的同时复习前面学习的东东西。 五、程序清单 #include #include #include #include #include #include usingnamespacestd; typedefchardatatype; typedefstructBitNode {datatypedata; structBitNode*lchild,*rchild; }*BitTree; queue voidBinTreeInit(BitTree&BT) {if(! (BT=(BitNode*)malloc(sizeof(BitNode))))exit(0); BT=NULL;} voidBinTreeCreat(BitTree&BT) {charch;ch=getchar();if(ch=='')BT=NULL; else{if(! (BT=(BitNode*)malloc(sizeof(BitNode))))exit(0); BT->data=ch;BinTreeCreat(BT->lchild);BinTreeCreat(BT->rchild);} } intBinTreeEmpty(BitTreeBT) {if(BT)return0;elsereturn1;} voidperordertraverse(BitTreeT) {if(T){printf("%c",T->data);perordertraverse(T->lchild); perordertraverse(T->rchild);} } voidinordertraverse(BitTreeT) {if(T){inordertraverse(T->lchild);printf("%c",T->data); inordertraverse(T->rchild);} } voidenordertraverse(BitTreeT) {if(T){enordertraverse(T->lchild);enordertraverse(T->rchild); printf("%c",T->data);} } voidcengordertraverse(BitTreeT) {BitNode*p; if(T){m.push(T); while(! m.empty()) {p=m.front();m.pop();printf("%c",p->data); if(p->lchild)m.push(p->lchild); if(p->rchild)m.push(p->rchild);} } } intBinTreeDepth(BitTreeBT) {inta,b,count;if(BT==NULL)count=0; else{a=BinTreeDepth(BT->lchild); b=BinTreeDepth(BT->rchild); if(a>b)count=a+1;elsecount=b+1;} returncount; } intBinTreeCount(BitTreeBT) {intcount=0,a,b;if(BT==NULL)count=0; else{a=BinTreeCount(BT->lchild);b=BinTreeCount(BT->rchild); count=a+b+1;} returncount; } voidzhujiemian() {cout< cout<<"\t\t\t\t数据结构实验三"< cout<<"\t\t----------------------------------------------"< cout<<"\t\t1初始化二叉树"< cout<<"\t\t2按先序次序建立二叉树"< cout<<"\t\t3判断二叉树是否为空"< cout<<"\t\t4遍历二叉树"< cout<<"\t\t5求二叉树的深度"< cout<<"\t\t6求二叉树中所有结点数"< cout<<"\t\t其他键退出"< cout<<"\t\t----------------------------------------------"< cout<<"\t请选择要进行操作的序号(1--6): "; } intmain() {BitTreeT;chara;zhujiemian();cin>>a; while(a! ='1') {cout<<"输入错误,必须先初始化,请重新输入: ";getchar();cin>>a;} cout< do{switch(a) {case'1': BinTreeInit(T); cout<<"初始化成功! "< case'2': getchar(); cout<<"请输入字符(空格代表空): "; BinTreeCreat(T);break; case'3': if(BinTreeEmpty(T)==1)cout<<"此二叉树为空! "< elsecout<<"此二叉树不空! "< case'4': if(BinTreeEmpty(T)==1)cout<<"二叉树为空无法遍历! "< else{cout<<"按先序次序输出二叉树中的所有结点为"< perordertraverse(T);cout< cout<<"按中序次序输出二叉树中的所有结点为"< inordertraverse(T);cout< cout<<"按后序次序输出二叉树中的所有结点为"< enordertraverse(T);cout< cout<<"按层序次序输出二叉树中的所有结点为"< cengordertraverse(T);cout< case'5': if(BinTreeEmpty(T)==1)cout<<"二叉树为空,深度为: 0"< elsecout<<"二叉树的深度为: "< case'6': if(BinTreeEmpty(T)==1)cout<<"二叉树为空,节点数为: 0"< elsecout<<"二叉树的所有节点数为: "< default: break; }system("pause");system("cls"); zhujiemian();cin>>a;cout< }while(a>'0'&&a<='6'); return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 二叉树的基本操作实现及其应用 二叉 基本 操作 实现 及其 应用
![提示](https://static.bdocx.com/images/bang_tan.gif)