二叉树的遍历算法实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二叉树实验报告
09信管石旭琳 20091004418
一、实验目的:
1、理解二叉树的遍历算法及应用
2、理解哈夫曼树及其应用。
3、掌握哈夫曼编码思想。
二、实验内容:
1、建立二叉树二叉链表
2、实现二叉树递归遍历算法(中序、前序、后序)
3、求二叉树高度
4、求二叉树结点个数
5、求二叉树叶子个数
6、将序号为偶数的值赋给左子树
三、主要程序:
#include
#include
typedef int ElemType;
struct BiTNode
{
ElemType data;
struct BiTNode *lch,*rch;
}BiTNode,*BiTree;
struct BiTNode *creat_bt1();
struct BiTNode *creat_bt2();
void preorder (struct BiTNode *t);
void inorder (struct BiTNode *t);
void postorder (struct BiTNode *t);
void numbt (struct BiTNode *t);
int n,n0,n1,n2;
void main()
{
int k;
printf("\n\n\n");
printf("\n\n 1.建立二叉树方法1(借助一维数组建立)"); printf("\n\n 2.建立二叉树方法2(先序递归遍历建立)"); printf("\n\n 3.先序递归遍历二叉树");
printf("\n\n 4.中序递归遍历二叉树");
printf("\n\n 5.后序递归遍历二叉树");
printf("\n\n 6.计算二叉树结点个数");
printf("\n\n 7.结束程序运行");
printf("\n==================================="); do
{
printf("\n请输入你要执行的操作(1,2,3,4,5,6,7)");
scanf("%d",&k);
printf("\n");
switch(k)
{
case 1:{
printf("你选择的是操作1,现用方法1进行建立二叉树\n");
BiTree=creat_bt1(); /* 调用性质5建立二叉树算法*/
break;
}
case 2:{
printf("你选择的是操作2,现用方法2进行建立二叉树\n");
BiTree=creat_bt2(); /* 调用递归建立二叉树算法*/
break;
}
case 3:{
printf("你选择的是操作3,现进行先序递归遍历二叉树\n结果为:");
preorder(BiTree);
break;
}
case 4:{
printf("你选择的是操作4,现进行中序递归遍历二叉树\n结果为:");
inorder(BiTree);
break;
}
case 5:{
printf("你选择的是操作5,现进行后序递归遍历二叉树\n结果为:");
postorder(BiTree);
break;
}
case 6:{ n=0,n0=0,n1=0,n2=0; /*全局变量置0 */
printf("你选择的是操作6,现进行计算二叉树结点个数\n结果为:");
numbt(BiTree);
printf("\n 二叉树结点总数是:%d",n);
printf("\n 二叉树叶子结点数是:%d",n0);
printf("\n 度为1的结点数是:%d",n1);
printf("\n 度为2的结点数是:%d",n2);
break;
}
case 7:{
printf("你选择的是操作8,将结束本程序运行,谢谢你的使用,再见!\n");
break;
}
}
}
while(k>=1&&k<7);
}
struct BiTNode *creat_bt1()
{
struct BiTNode *v[50],*p,*t;
int i,j;
ElemType e; /*输入结点的序号i、结点的数据e */
printf("\n i,data=");
scanf("%d,%d",&i,&e);
while(i!=0&&e!=0)
{
p=(struct BiTNode *)malloc(sizeof(struct BiTNode));
p->data=e;
p->lch=NULL;
p->rch=NULL;
v[i]=p;
if (i==1) /*序号为1的结点是根*/
t=p;
else
{
j=(i+1)/2;
if(i%2==0) /*序号为偶数,做左孩子*/
v[j]->lch=p;
else
v[j]->rch=p;
}
printf("\n i,data=");
scanf("%d,%d",&i,&e);
}
return t;
}
struct BiTNode *creat_bt2()
{
struct BiTNode *t;
int e;