数据结构实验7二叉树子系统.docx
《数据结构实验7二叉树子系统.docx》由会员分享,可在线阅读,更多相关《数据结构实验7二叉树子系统.docx(20页珍藏版)》请在冰豆网上搜索。
数据结构实验7二叉树子系统
验证性实验7:
二叉树子系统
班级学号BX100420姓名施程程成绩
1.实验目的
(1)掌握二叉树的特点及其存储的方式。
(2)掌握二叉树的创建和显示方法。
(3)复习二叉树遍历的概念,掌握二叉树遍历的基本方法
(4)掌握求二叉树的叶结点数、总结点数和深度等基本算法。
2.实验内容
(1)按屏幕提示用前序方法建立一棵二叉树,并能按凹入法显示二叉树结构。
(2)编写前序遍历、中序遍历、后序遍历、层次遍历程序。
(3)编写求二叉树的叶结点数、总结点数和深度的程序。
(4)设计一个选择式菜单,以菜单方式选择下列操作。
二叉树子系统
********************************************");
*1---------建二叉树*");
*2---------凹入显示*");
*3---------先序遍历*");
*4---------中序遍历*");
*5---------后序遍历*");
*6---------层次遍历*");
*7---------求叶子数*");
*8---------求结点数*");
*9---------求树深度*");
*0---------返回*");
********************************************");
请选择菜单号(0--9):
3.实验步骤:
(1)输入并调试程序;
(2)按下图建立二叉树;
二叉树子系统
******************************************
*1---------建二叉树*
*2---------凹入显示*
*3---------先序遍历*
*4---------中序遍历*
*5---------后序遍历*
*6---------层次遍历*
*7---------求叶子数*
*8---------求结点数*
*9---------求树深度*
*0---------返回*
******************************************
请选择菜单号:
1
请输入按先序建立二叉树的结点序列:
说明:
'0'代表后继结点为空,请逐个输入,按回车键输入下一结点。
请输入根结点:
a
请输入a结点的左子结点:
b
请输入b结点的左子结点:
d
请输入d结点的左子结点:
0
请输入d结点的右子结点:
0
请输入b结点的右子结点:
0
请输入a结点的右子结点:
c
请输入c结点的左子结点:
e
请输入e结点的左子结点:
0
请输入e结点的右子结点:
0
请输入c结点的右子结点:
f
请输入f结点的左子结点:
0
请输入f结点的右子结点:
0
(3)检查凹入法显示的二叉树是否正确;
二叉树子系统
******************************************
*1---------建二叉树*
*2---------凹入显示*
*3---------先序遍历*
*4---------中序遍历*
*5---------后序遍历*
*6---------层次遍历*
*7---------求叶子数*
*8---------求结点数*
*9---------求树深度*
*0---------返回*
******************************************
请选择菜单号:
2
凹入表示法:
a▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃
b▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃
d▃▃▃▃▃▃▃▃▃▃▃▃▃
c▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃
e▃▃▃▃▃▃▃▃▃▃▃▃▃
f▃▃▃▃▃▃▃▃▃▃▃▃▃
按回车键返回主菜单!
(4)检查其他算法的正确性举例:
二叉树子系统
******************************************
*1---------建二叉树*
*2---------凹入显示*
*3---------先序遍历*
*4---------中序遍历*
*5---------后序遍历*
*6---------层次遍历*
*7---------求叶子数*
*8---------求结点数*
*9---------求树深度*
*0---------返回*
******************************************
请选择菜单号:
3
该二叉树的先序遍历序列为:
abdcef
4.实验程序
#include
#defineTREEMAX100
typedefstructBT
{
chardata;
BT*lchild;
BT*rchild;
}BT;
BT*CreateTree();
voidShowTree(BT*T);
voidPreorder(BT*T);
voidPostorder(BT*T);
voidLevelorder(BT*T);
voidInorder(BT*T);
voidLeafnum(BT*T);
voidNodenum(BT*T);
intTreeDepth(BT*T);
intcount=0;
voidmain()
{
BT*T=NULL;
charch1,ch2,a;
ch1='y';
while(ch1=='y'||ch1=='y')
{
printf("\n");
printf("\n\t\t二叉树子系统");
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---------返回*");
printf("\n\t\t******************************************");
printf("\n\t\t请选择菜单号(0--9):
");
scanf("%c",&ch2);
getchar();
printf("\n");
switch(ch2)
{
case'1':
printf("\n\t\t请按先序序列输入二叉树的结点:
\n");
printf("\n\t\t说明:
输入结点('0'代表后继结点为空)后按回车.\n");
printf("\n\t\t请输入根结点:
");
T=CreateTree();
printf("\n\t\t二叉树成功建立!
\n");break;
case'2':
ShowTree(T);break;
case'3':
printf("\n\t\t该二叉树的先序遍历序列为:
");
Preorder(T);break;
case'4':
printf("\n\t\t该二叉树的中序遍历序列为:
");
Inorder(T);break;
case'5':
printf("\n\t\t该二叉树的后序遍历序列为:
");
Postorder(T);break;
case'6':
printf("\n\t\t该二叉树的层次遍历序列为:
");
Levelorder(T);break;
case'7':
count=0;Leafnum(T);
printf("\n\t\t该二叉树有%d个叶子。
\n",count);break;
case'8':
count=0;Nodenum(T);
printf("\n\t\t该二叉树总共有%d个结点。
\n",count);break;
case'9':
printf("\n\t\t该树的深度是:
%d",TreeDepth(T));break;
case'0':
ch1='n';break;
default:
printf("\n\t\t***请注意:
输入有误!
***");
}
if(ch2!
='0')
{
printf("\n\n\t\t按【Enter】键继续,按任意键返回主菜单!
\n");
a=getchar();
if(a!
='\xA')
{
getchar();
ch1='n';
}
}
}
}
BT*CreateTree()
{
BT*t;
charx;
scanf("%c",&x);
getchar();
if(x=='0')
t=NULL;
else
{
t=newBT;
t->data=x;
printf("\n\t\t请输入%c结点的左子结点:
",t->data);
t->lchild=CreateTree();
printf("\n\t\t请输入%c结点的右子结点:
",t->data);
t->rchild=CreateTree();
}
returnt;
}
voidPreorder(BT*T)
{
if(T)
{
printf("%3c",T->data);
Preorder(T->lchild);
Preorder(T->rchild);
}
}
voidInorder(BT*T)
{
if(T)
{
Inorder(T->lchild);
printf("%3c",T->data);
Inorder(T->rchild);
}
}
voidPostorder(BT*T)
{
if(T)
{
Postorder(T->lchild);
Postorder(T->rchild);
printf("%3c",T->data);
}
}
voidLevelorder(BT*T)
{
inti,j;
BT*q[100],*p;
p=T;
if(p!
=NULL)
{i=1;q[i]=p;j=2;}
while(i!
=j)
{
p=q[i];printf("%3c",p->data);
if(p->lchild!
=NULL)
{q[j]=p->lchild;j++;}
if(p->rchild!
=NULL)
{q[j]=p->rchild;j++;}
i++;
}
}
voidLeafnum(BT*T)
{
if(T)
{
if(T->lchild==NULL&&T->rchild==NULL)
count++;
Leafnum(T->lchild);
Leafnum(T->rchild);
}
}
voidNodenum(BT*T)
{
if(T)
{
count++;
Nodenum(T->lchild);
Nodenum(T->rchild);
}
}
intTreeDepth(BT*T)
{
intldep,rdep;
if(T==NULL)
return0;
else
{
ldep=TreeDepth(T->lchild);
rdep=TreeDepth(T->rchild);
if(ldep>rdep)
returnldep+1;
else
returnrdep+1;
}
}
voidShowTree(BT*T)
{
BT*stack[TREEMAX],*p;
intlevel[TREEMAX][2],top,n,i,width=4;
if(T!
=NULL)
{
printf("\n\t\t凹入表示法:
\n\t\t");
top=1;
stack[top]=T;
level[top][0]=width;
while(top>0)
{
p=stack[top];
n=level[top][0];
for(i=1;i<=n;i++)
printf("");
printf("%c",p->data);
for(i=n+1;i<30;i+=2)
printf("▃");
printf("\n\t\t");
top--;
if(p->rchild!
=NULL)
{
top++;
stack[top]=p->rchild;
level[top][0]=n+width;
level[top][1]=2;
}
if(p->lchild!
=NULL)
{
top++;
stack[top]=p->lchild;
level[top][0]=n+width;
level[top][1]=1;
}
}
}
}
5.程序运行
6.实验小结
本章要求我们掌握的是二叉树的特点、存储方式、创建、显示、遍历以及节点数等计算方法。
这个实验要求设计的是一颗二叉树,要求能用凹入法显示二叉树的结构,能读出前序遍历、中序遍历、后序遍历和层次遍历,以及会求解叶节点数、总节点数和树的深度。
在输入程序的时候有些错误,但在编译和构建的时候都改正了,执行起来很方便。
程序中在后面注释的帮助下也能知道相应程序的作用,结合上课听到的知识更容易理解了,这对我是一个不小的帮助。
当然,在编译时发现错误的时候,改正也能帮我巩固记忆,让我知道什么地方错了,也能更好的学习并记住,争取以后不会再犯同样的错误。
总的来说,本次实验还是成功的。