




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据结构实验报告
指导教师xX实验时间:指23年
J_L月L日
学院计算机学院专业信息安全
班级XXXXXX学号XXXXX姓名XX实验室
S331
实验题目:二叉树操作
实验规定:
采用二叉树链表作为存储结构,完毕二叉树的建立,先序、中序和后序以及按层次
遍历的操作,求所有叶子及结点总数的操作。
示例程序:
#include"stdio.h〃
#include"string.h〃
#defineMax20〃结点的最大个数
typedefstructnode{
chardata;
structnode*1child,*rchild;
}BinTNode;〃自定义二叉树的结点类型
typedefBinTNode*BinTree;〃定义二叉树的指针
intNodeNum,leaf;〃NodeNum为结点数,leaf为叶子数
〃=二=======基于先序遍历算法创建二叉树==========
//=====规定输入先序序列,其中加入虚结点以不空指针的位置==========
BinTreeCreatBinTree(void)
BinTreeT;
charch;
if((ch=getchar())=='#')
return(NULL);〃读入礼返回空指针
else(
<>T=(BinTNode*)malloc(sizeof(BinTNode));生成结点
«»T->data=ch;
◎T—>1child=CreatBinTree();//构造左子树
oT->rchi1d=CreatBinTree();〃构造右子树
return(T);
}
)
〃=二二==二二=NLR先序遍历=二========
voidPreorder(BinTreeT)
I
if(T){
gprintfT—>data);〃访问结点
oPreorder(T->lchi1d);〃先序遍历左子树
Preorder(T->rchild);//先序遍历右子树
)
)
//=二=二二二二二LNR中序遍历二=========
//==========LRN后序遍历=========
//===采用后序遍历求二叉树的深度、结点数及叶子数的递归算法==
intTreeDepth(BinTreeT)
inth1,hr,max;
if(T){
hl=TreeDepth(T->1chi1d);“/求左深度
。hr=TreeDepth(T->rchild);//求右深度
max=hl>hr?hl:hr;〃取左右深度的最大值
NodeNum=NodeNum+1;〃求结点数
if(hl==0&&,hr==0)leaf=leaf+1;//若左右深度为0,即为叶子。
return(max+l);
)
elsereturn(0);
)
〃====运用"先进先出"(FIFO)队列,按层次遍历二叉树========
voidLevelorder(BinTreeT)
I
intfront=0,rear=l;
BinTNode*cq[Max],*p;〃定义结点的指针数组cq
cq[1]=T;//根入队
while(front!=rear)
(
8front=(front+1)%NodeNum;
。p=cq[front];〃出队
aprintf("%c〃,p->data);//出队,输出结点的值
gif(p->lchi1d!=NULL){
。rear=(rear+1)%NodeNum;
00cq[rear]=p->lchi1d;//左子树入队
oif(p->rchi1d!=NULL){
。rear=(rear+1)%NodeNum;
ocq[rear]=p->rchi1d;〃右子树入队
)
}
voidmain()
{
BinTreeroot;
inti,depth;
printf("\n〃);
printf(〃CreatBinTree;Inputpreorder:,z);〃输入完全二叉树的先
序序列,
//用#代表虚结点,如ABD###CE##F##
root=CreatBinTree();〃创建二叉树,返回根结点
do{//从菜单中选择遍历方式,输入序号。
oprintf(〃\t**********select********");
printf(〃\tl:PreorderTraversa1\n〃);
8Printf("\t2:IorderTraversa1\n〃);
oprintf("\t3:Postordertraversal\n〃);
叩rintf("\t4:PostTreeDepth,Nodenumber,Leafnumber\n〃);
printfC\t5:LevelDepth\nz,);//按层次遍历之前,先选择4,求出该树的结点
数。
叩rintf(H\t0:Exit\n〃);
printf('\t*******************************\n〃);
scanf(〃%d",&i);//输入菜单序号(0-5)
switch(i){
必case1:printf(〃PrintBin_treePreorder:,z);
。Preorder(root);//先序遍历
obreak;
ocase2:printf("PrintBinTreeInorder:〃);
g^Inorder(root);〃中序遍历
◎break;
。case3:printf("PrintBin_TreePostorder:〃);
gPostorder(root);〃后序遍历
break;
case4:depth=TreeDepth(root);〃求树的深度及叶子数
oprintf(〃BinTreeDepth=%dBinTreeNodenumber=%d,z,depth,N
odeNum);
ooprintf(〃BinTreeLeafnumber=%d,z,leaf);
oobreak;
oe*>case5:printf(〃LevePrintBin_Tree:〃);
Levelorder(root);//按层次遍历
gbreak;
defau1t:exit(l);
°)
gprintf("\n〃);
}while(i!=0);
)
实验内容及环节:
1、分析、理解程序。
2、添加中序和后序遍历算法.
3、调试程序,设计一棵二叉树,输入完全二叉树的先序序列,用#代表虚结点(空指针),
如ABD###CE##F##,建立二叉树,求出先序、中序和后序以及按层次遍历序列,
求所有叶子及结点总数。
4、画出所设计的二义树,以后序遍历算法为例,画出执行踪迹示意图。给出实验结果。
5、给出实验结果。
改正后的完整程序:
#include"stdio.hn
#include"string.h"
#include<malloc.h>
#include<stdlib.h>
#defineMax20//结点的最大个数
typedefstructnode{
chardata;
structnode*Ichiid,*rchi1d;
}BinTNode;//自定义二叉树的结点类型
typedefBinTNode*BinTree;//定义二叉树的指针
intNodeNum,leaf;//NodeNum为结点数,leaf为叶子数
//==========基于先序遍历算法创建二叉树==============
〃=====规定输入先序序列,其中加入虚结点"#"以示空指针的位置==========
BinTreeCreatBinTree(void)
BinTreeT;
charch;
if((ch=getcha「())=='#')
return(NULL);〃读入#,返回空指针
else{
oT=(BinTNode)malloc(sizeof(BinTNode));//生成结点
。T->data=ch;
T->1chi1d=CreatBinTree();//构造左子树
ooT—>rchild=CreatBinTree();〃构造右子树
oreturn(T);
)
)
//========NLR先序遍历=============
voidPreorder(BinTreeT)
(
if(T){
oprintf(n%cn,T->data);〃访问结点
^Preorder(T->lchiId);〃先序遍历左子树
。Preorder(T->rchi1d);〃先序遍历右子树
)
)
//========LNR中序遍历===============
voidInorder(BinTreeT)
(
if(T){
。。Inorder(T—>lchiId);〃先序遍历左子树
printf(*'%cn,T->data);〃访问结点
Inorder(T—>rchi1d);〃先序遍历右子树
}
)
/*voidInorder(BinTreeT)。
whi1e(pI|!StackEmpty(BinTreeT)){
qf(T){Push(BinTreeT,T);T=T->1child;}//根指针进栈,遍历左子树
oelse{//根指针退栈,访问根节点,遍历右子树
Pop(BinTreeT,t);
“if(!Visit(T->data))
returnERROR;
。T=T-rchild;
}//else
)//while
returnOK;
)
*/
//==========LRN后序历============
voidPostorder(BinTreeT)
(
if(T){
。Postorder(T—>lchild);〃先序遍历左子树
。Postorder(T—>rchi1d);〃先序遍历右子树
printf(u%c",T->data);〃访问结点
〃=====采用后序遍历求二叉树的深度、结点数及叶子数的递归算法=:
intTreeDepth(BinTreeT)
(
inthl,hr,max;
if(T){
hl=TreeDepth(T->lchild);〃求左深度
hr=TreeDepth(T->rchi1d);//求右深度
max=h1>hr?hl:hr;//取左右深度的最大值
"NodeNum=NodeNum+1;〃求结点数
if(hl==O&&hr==0)leaf=leaf+l;//若左右深度为0,即为叶子。
。retum(max+l);
)
elsereturn(0);
)
〃=二==运用"先进先出"(FIFO)队列,按层次遍历二叉树==========
voidLeve1order(BinTreeT)
(
intfront=0,rear=1;
BinTNode*cq[Max],*p;//定义结点的指针数组cq
cq[l]=T;//根入队
while(front!=rear)
(
®front=(front+l)%NodeNum;
p=cq[front];〃出队
printf("%cn,p->data);〃出队,输出结点的值
if(p->lchild!=NULL){
rear=(rear+1)%NodeNum;
。。cq[rear]=p->lchild;//左子树入队
0}
ooif(p->rchiId!=NULL){
。rear=(rear+1)%NodeNum;
。cq[rear]=p—>rchild;//右子树入队
}
)
)
//==========±函数=================
voidmain()
(
BinTreeroot;
inti,depth;
printf("\n");
printf(℃reatBin_Tree;Inputpreorder:");〃输入完全二叉树的先序序列,
〃用#代表虚结点,如ABD###CE##F##
root=CreatBinTree();〃创建二叉树,返回根结点
do{〃从菜单中选择遍历方式,输入序号。
»°printf(u\t**********select********");
printf("\t1:PreorderTraversal\n”);
eprintf(n\t2:lorderTraversal\n");
«printf(M\t3:Postordertraversa1\nM);
ooprintf(n\t4:PostTreeDepth,Nodenumber,Leafnumber\n");
®printf(n\t5:Leve1Depth\n");//按层次遍历之前,先选择4,求出该树的结点数。
叩rimf("\tO:Exit\n");
gprintf(%*******************************\n")♦
scanf("%dn,&i);//输入菜单序号(0—5)
switch(i){
gcase1:printf("PrintBin_treePreorder:");
°Preorder(root);//先序遍历
obreak;
case2:printf("PrintBin_TreeInorder:");
。。Inorder(root);〃中序遍历
wbreak;
。case3:printf(”PrintBin_TreePostorder:");
6Postorder(root);〃后序遍历
»break;
case4:depth=TreeDepth(root);〃求树的深度及叶子数
。printf(nBinTreeDepth=%dBinTreeNodenumber=%d",d
epth,NodeNum);
aprintf(MBinTreeLeafnumber=%d",leaf);
。break;
case5:printf(nLevePrintBin_Tree:");
°Lev
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030中国网球穿线机行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国绿色超级米行业市场发展现状及竞争格局与投资前景研究报告
- 2025-2030中国纺织级PET切片行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国等离子显示屏行业市场现状供需分析及市场深度研究发展前景及规划可行性分析研究报告
- 2025-2030中国磁座钻行业发展分析及投资前景预测研究报告
- 2025-2030中国硫代乙酰胺行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国石灰消化机行业市场深度调研及发展趋势与投资前景预测研究报告
- 2025年厂级员工安全培训考试试题带答案(基础题)
- 2025班组安全培训考试试题答案4A
- 2025-2030中国白板和和黑板行业市场发展趋势与前景展望战略研究报告
- 供应链管理-第十三章供应链绩效评价课件
- 水利工程建设标准强制性条文
- DB15T 489-2019 石油化学工业建设工程技术资料管理规范
- 数学课堂教学技能讲座课件
- 异物管控记录表
- 公车私用管理制度
- 设备主人制管理办法
- 市政基础设施工程旁站监理记录表
- 幼儿园绘本:《小蛇散步》 课件
- 《艺术学概论考研》课件艺术本体论-形式论
- 遵义会议ppt课件
评论
0/150
提交评论