完整word版二叉树的基本操作实验.docx
《完整word版二叉树的基本操作实验.docx》由会员分享,可在线阅读,更多相关《完整word版二叉树的基本操作实验.docx(10页珍藏版)》请在冰豆网上搜索。
![完整word版二叉树的基本操作实验.docx](https://file1.bdocx.com/fileroot1/2022-12/11/d1197537-7449-4582-bcdd-c216d0855049/d1197537-7449-4582-bcdd-c216d08550491.gif)
完整word版二叉树的基本操作实验
实验三二叉树的基本运算
一、实验目的
1、使学生熟练掌握二叉树的逻辑结构和存储结构.
2、熟练掌握二叉树的各种遍历算法。
二、实验内容
[问题描述]
建立一棵二叉树,试编程实现二叉树的如下基本操作:
1。
按先序序列构造一棵二叉链表表示的二叉树T;
2。
对这棵二叉树进行遍历:
先序、中序、后序以及层次遍历,分别输出结点的遍历序列;
3.求二叉树的深度/结点数目/叶结点数目;(选做)
4.将二叉树每个结点的左右子树交换位置。
(选做)
[基本要求]
从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立),
[测试数据]
如输入:
ABCффDEфGффFффф(其中ф表示空格字符)
则输出结果为
先序:
ABCDEGF
中序:
CBEGDFA
后序:
CGEFDBA
层序:
ABCDEFG
[选作内容]
采用非递归算法实现二叉树遍历。
三、实验前的准备工作
1、掌握树的逻辑结构.
2、掌握二叉树的逻辑结构和存储结构。
3、掌握二叉树的各种遍历算法的实现.
一实验分析
本次试验是关于二叉树的常见操作,主要是二叉树的建立和遍历。
二叉树的遍历有多种方法,本次试验我采用递归法,递归法比较简单。
二概要设计
功能实现
1.intCreatBiTree(BiTree&T)用递归的方法先序建立二叉树,并用链表储存该二叉树
2.intPreTravel(BiTree&T)前序遍历
3。
intMidTravel(BiTree&T)中序遍历
4。
intPostTravel(BiTree&T)后序遍历
5。
intDepth(BiTree&T)//计算树的深度
6。
inthowmuch(BiTreeT,inth)采用树节点指针数组,用于存放遍历到的元素地址,如果有左孩子,存入地址,j加一,否则没操作,通过访问数组输出层次遍历的结果。
k计算叶子数,j为总节点.
7。
intexchang(BiTree&T)交换左右子树,利用递归,当有左右孩子时才交换
三详细设计
#include〈stdio.h>
#include〈stdlib.h>
typedefstructBiTNode
{
chardata;
structBiTNode*lchild,*rchild;
}BiTNode,*BiTree;
intCreatBiTree(BiTree&T)
{//先序法创建二叉树
charch;
if((ch=getchar())=='’)
T=NULL;
else
{
T=(BiTNode*)malloc(sizeof(BiTNode));
if(!
T)
exit
(1);
T-〉data=ch;
CreatBiTree(T-〉lchild);
CreatBiTree(T-〉rchild);
}
return0;
}
intPreTravel(BiTree&T)
{//前序遍历
if(T)
{
printf("%c",T—>data);
PreTravel(T—〉lchild);
PreTravel(T—>rchild);
}
return0;
}
intMidTravel(BiTree&T)
{//中序遍历
if(T)
{
MidTravel(T—〉lchild);
printf("%c",T-〉data);
MidTravel(T-〉rchild);
}
return0;
}
intPostTravel(BiTree&T)
{//后序遍历
if(T)
{
PostTravel(T-〉lchild);
PostTravel(T-〉rchild);
printf(”%c",T-〉data);
}
return0;
}
inthowmuch(BiTreeT,inth)
{
BiTNode*Q[100];//树节点指针数组,用于存放遍历到的元素地址
if(T==NULL)
printf(”空的二叉树\n”);
Q[0]=T;//存入树根
inti,k=0;
intj=1;//j为总节点
for(i=0;i〈j;i++)
{
if(Q[i]-〉lchild!
=NULL)//如果有左孩子,存入地址,j加一,否则没操作
{
Q[j]=Q[i]—〉lchild;
j++;
}
if(Q[i]->rchild!
=NULL)//如果有右孩子,存入地址,j加一,否则没操作
{
Q[j]=Q[i]—〉rchild;
j++;
}
if(Q[i]—〉lchild==NULL&&Q[i]->rchild==NULL)
k++;//计算叶子数
}
if(h==0)
printf(”%d",j);
elseif(h==1)
printf(”%d”,k);
elseif(h==2)
{
for(i=0;iprintf(”%c”,Q[i]-〉data);
}
else
{
printf(”参数错误");
}
return0;
}
intDepth(BiTree&T)//计算树的深度
{
intlh,rh;
if(NULL==T)
{
return0;
}
else
{
lh=Depth(T-〉lchild);
rh=Depth(T—>rchild);
return(lh〉rh?
lh:
rh)+1;
}
}
intexchang(BiTree&T)//交换左右子树
{
if(T!
=NULL)
{
if(T—>lchild!
=NULL&&T-〉rchild!
=NULL)//当有左右孩子时才交换
{
chart;
t=T-〉lchild—〉data;
T—>lchild—〉data=T->rchild-〉data;
T—〉rchild—〉data=t;//交换数据
}
exchang(T-〉lchild);//递归调用
exchang(T—〉rchild);
}
return0;
}
intchoose(BiTreeT)//功能选
{
inta;
scanf(”%d”,&a);
if(a==1)
{
printf(”先序遍历:
”);
PreTravel(T);
}
elseif(a==2)
{
printf(”中序遍历:
”);
MidTravel(T);
}
elseif(a==3)
{
printf(”后序遍历:
");
PostTravel(T);
}
elseif(a==4)
{
printf("层序遍历:
”);
howmuch(T,2);
}
elseif(a==5)
{
printf(”总节点数:
");
howmuch(T,0);
}
elseif(a==6)
{
printf(”总叶子数:
”);
howmuch(T,1);
}
elseif(a==7)
{
printf("树的深度:
”);
printf(”%d”,Depth(T));
}
elseif(a==8)
{
printf("交换前\n”);
howmuch(T,2);
exchang(T);
printf("交换后\n”);
howmuch(T,2);
}
elseif(a==9)
exit
(1);
elseprintf(”没有这个操作\n”);
printf("操作完成,请输入下一个操作\n");
choose(T);
return0;
}
intmain()//主函数
{
printf("—-————--——--——--二叉树的基本操作-————-——--——-—-—\n");
printf(”请先建立二叉树,按先序的方式输入如果数据为空输入空格\n”);
BiTreeT;//定义二叉树,初始化
CreatBiTree(T);
choose(T);
return0;
}
四用户手册
根据程序的提示按先序输入二叉树,如果数据为空输入空格,然后回车,输入你要进行的操作的序号.1.先序遍历、2中序遍历、3后序遍历、4层次遍历、5总节点数、6总叶子数、7树的深度、8交换左右子树、9结束操作
五实验总结
通过实验,我熟悉二叉树树的基本操作,掌握二叉树的实现以及实际应用。
加深了对二叉树的理解,逐步培养解决实际问题的编程能力以及进一步了解了二叉树。
递归的使用,要注意,初始时的状态以及如何使用递归,注意普遍性,思考时从普通的开始。
通过这次上机操作,让我明白书本上的程序一定要自己去调试,这样才能将书本程序与老师讲的内容融会贯通,达到温故而知新。
六运行结果
图
(1)
图表1