当前位置:文档之家› 二叉树的遍历算法实验报告

二叉树的遍历算法实验报告

二叉树实验报告
09信管石旭琳 20091004418
一、实验目的:
1、理解二叉树的遍历算法及应用
2、理解哈夫曼树及其应用。

3、掌握哈夫曼编码思想。

二、实验内容:
1、建立二叉树二叉链表
2、实现二叉树递归遍历算法(中序、前序、后序)
3、求二叉树高度
4、求二叉树结点个数
5、求二叉树叶子个数
6、将序号为偶数的值赋给左子树
三、主要程序:
#include<stdio.h>
#include<stdlib.h>
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;
printf("\n data=");
scanf("%d",&e);
if(e==0) t=NULL; /*对于0值,不分配新结点*/
else
{
t=(struct BiTNode *)malloc(sizeof(struct BiTNode));
t->data=e;
t->lch=creat_bt2(); /*左孩子获得新指针值*/
t->rch=creat_bt2();
}
return (t);
}
void preorder (struct BiTNode *t)
{
if(t)
{
printf("%d ",t->data);
preorder(t->lch);
preorder(t->rch);
}
}
void inorder (struct BiTNode *t)
{
if(t)
{
inorder(t->lch);
printf("%d ",t->data);
inorder(t->rch);
}
}
void postorder(struct BiTNode *t)
{
if(t)
{
postorder(t->lch);
postorder(t->rch);
printf("%d ",t->data);
}
}
void numbt(struct BiTNode *t)
{
if(t)
{
numbt(t->lch);
{
n++;
if(t->lch==NULL&&t->rch==NULL)
n0++;
if((t->lch==NULL&&t->rch!=NULL)||(t->lch!=NULL&&t->rch==NUL L))
n1++;
if(t->lch!=NULL&&t->rch!=NULL)
n2++;
}
numbt(t->rch);
}
}
四、测试结果:
五、小结:
实操后还是会搞不清楚数据域及指针域的定义类型的不同。

但是二叉树的先序、中序、后序输出都是递归算法,用起来并没有想象中复杂。

相关主题