数据结构
实验 二叉树的存储与遍历
一、实验目的
1、熟练掌握二叉树的存储结构。
2、熟练掌握二叉树的遍历及基本操作的实现方法。
二、实验原理
1、二叉树的存储结构及其应用。
三、实验设备
Win系统电脑一台
四、实验过程(程序清单)
#define DATAYPE2 char
#include<stdio.h>
#include<malloc.h>
//定义二叉树结构
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
int count=0;//全局计算机
//1.先序创建一颗二叉树
void CreateBiTree(BiTree *T){
BiTree t;
char ch;
scanf("%c",&ch);
if(ch==' '){
t=NULL;
}else{
t=(BiTree)malloc(sizeof(BiTNode));
t->data=ch;
CreateBiTree(&t->lchild);
CreateBiTree(&t->rchild);
}
*T=t;
}
//2.递归先序遍历输出
void PreOrderTraverse(BiTree T){
if(T!=NULL){
printf("%3c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
//3. 中序遍历
void InOrderTraverse(BiTree T){
if(T!=NULL){
InOrderTraverse(T->lchild);
printf("%3c",T->data);
InOrderTraverse(T->rchild);
}
}
//4.后序遍历
void PostOrderTraverse(BiTree T){
if(T){
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%3c",T->data);
}
}
//5.层次遍历
void LevelorderTraverse(BiTNode *T){
BiTNode *Queue[50],*p=T;
int front=0,rear=0;
if(p!=NULL){
Queue[rear++]=p;
}
// printf("层次遍历:");//根结点入队
while(front<rear){
p=Queue[front++];
printf("%3c",p->data);
if(p->lchild!=NULL){
Queue[rear++]=p->lchild; //左结点入队
}
if(p->rchild!=NULL){
Queue[rear++]=p->rchild; //右结点入队
}
}
}
//6.求叶子节点数
void leafnum(BiTNode *T){
if(T){
if((T->lchild==NULL)&&(T->rchild==NULL)){
count++;
}
leafnum(T->lchild);
leafnum(T->rchild);
}
}
//7.求总结点数
void Nodenum(BiTNode *T){
if(T){
count++;
Nodenum(T->lchild);
Nodenum(T->rchild);
}
}
//8.树的深度
int treehigh(BiTNode *bt){//求二叉树的深度
int lh, rh,h;
if(bt==NULL){
h=0;
}
else{
lh=treehigh(bt->lchild);
rh=treehigh(bt->rchild);
h=(lh>rh?lh:rh)+1;
}
return h;
}
//9.判定两棵树是否相等
int CmpTree(BiTree T1,BiTree T2){
int left,right;
if(T1==NULL&&T2==NULL)//两棵树都为NULL,相等
return 1;
else if(T1==NULL||T2==NULL)//两棵树只有一棵树为NULL,不等
return 0;
if(T1->data!=T2->data)
return 0;
left=right=0;
left=CmpTree(T1->lchild,T2->lchild);
right=CmpTree(T1->rchild,T2->rchild);
return left&&right;
}
int main(){
BiTree T,T2;
char ch1;
int ch2;
ch1='y';
while(ch1=='y'||ch1=='Y'){
printf("\n\n\n\n");
printf("\n\t\t***********二叉树非递归**********************");
printf("\n\t\t* 1.建立二叉树 *");
printf("\n\t\t* 2.先序遍历二叉树 *");
printf("\n\t\t* 3.中序遍历二叉树 *");
printf("\n\t\t* 4.后序遍历二叉树 *");
printf("\n\t\t* 5.层次遍历二叉树 *");
printf("\n\t\t* 6.叶子节点数 *");
printf("\n\t\t* 7.总结点数 *");
printf("\n\t\t* 8.树的深度 *");
printf("\n\t\t* 9.判定两棵树是否相等 *");
printf("\n\t\t* 0.exit *");
printf("\n\t\t*********************************************");
printf("\n\t\t Please select(0-9)");
scanf("%d",&ch2);
getchar();
switch(ch2){
case 1:
printf("\n\t\t 输入数据: ");
CreateBiTree(&T);
break;
case 2:
printf("\n\t先序遍历序列:");
PreOrderTraverse(T);
break;
case 3:
printf("\n\t中序遍历序列:");
InOrderTraverse(T);
break;
case 4:
printf("\n\t后序遍历序列:");
PostOrderTraverse(T);
break;
case 5:
printf("\n\t层次遍历序列:");
LevelorderTraverse(T);
break;
case 6:
leafnum(T);
printf("\n\t叶子节点数: %d",count);
count=0;break;
case 7:Nodenum(T);
printf("\n\t结点数: %d",count) ;
count=0;break;
case 8:
printf("\n\t树的深度为: %d",treehigh(T));
break;
case 9:
int cmp;
printf("\n\t请输入第二个参与比较的树:");
CreateBiTree(&T2);
cmp=CmpTree(T,T2);
if(cmp==0){
printf("\n\t两棵树不相等");
}
else{
printf("\n\t两棵树相等");
}
break;
case 0:
ch1='n';break;
default:
printf("\n\t\t****ERROR****");
}
}
}
五、实验结果
六、实验心得
1、掌握了二叉树先序遍历、中序遍历、后序遍历和层次遍历。
2、学会求树的叶子节点数、结点数和树的深度。
3、掌握了如何判定两棵树是否相等。
4、理解了测试数据与其树的转换。