实验四二叉树子系统.docx
《实验四二叉树子系统.docx》由会员分享,可在线阅读,更多相关《实验四二叉树子系统.docx(9页珍藏版)》请在冰豆网上搜索。
实验四二叉树子系统
实验四-二叉树子系统
韶关学院
学生实验报告册
实验课程名称:
数据结构与算法
实验项目名称:
实验四二叉树子系统
实验类型(打√):
(基础√、综合、设计)
院系:
计算机科学学院专业:
计算机科学技术
姓名:
***学号:
*****
指导老师:
陈正铭
韶关学院教务处编制
一、实验预习报告内容
预习日期:
2011年9月18日
【实验目的】
(1)掌握二叉树的特点及其存储的方式。
(2)掌握二叉树的创建和显示方法。
(3)复习二叉树遍历的概念,掌握二叉树遍历的方法
(4)掌握求二叉树的叶结点数、总结点数和深度等算法。
【实验内容】
(1)按屏幕提示用前序方法建立一棵二叉树,并能按凹入法显示二叉树结构;
(2)编写前序遍历、中序遍历、后序遍历、层次遍历程序。
(3)编写求二叉树的叶结点数、总结点数和深度的程序。
(4)设计一个选择式菜单,以菜单方式选择下列操作。
二叉树子系统
********************************************
*1---------建二叉树*
*2---------凹入显示*
*3---------先序遍历*
*4---------中序遍历*
*5---------后序遍历*
*6---------层次遍历*
*7---------求叶子数*
*8---------求结点数*
*9---------求树深度*
*0---------返回*
********************************************
请选择菜单号:
三、实验报告内容
2011年9月21日
【实验程序主要代码】:
#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按回车键继续,按任意键返回主菜单!
\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;
elsereturnrdep+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;
}
}
}
}
实验报告评分:
注:
1、如有个别实验的实验报告内容多,实验报告册页面不够写,或有识图,画图要求的,学生应根据实