数据结构C语言编程——二叉树 哈夫曼树

#include
#define M 8
#define MAX 200

typedef struct
{
int data;
int pa,lc,rc; //包括节点自身权值,双亲,左孩子和右孩子
}JD;

void huffman(int n,int w[],JD t[]) //用一维结构数组存储,由N个节点构成的哈夫曼树,节点数为2N-1,叶子节点数为N
{
int i,j,k,x1,x2,m1,m2;
for(i=1;i<(2*n);i++) //对2N-1个节点初始化
{
t[i].pa=t[i].lc=t[i].rc=0; //双亲,左右孩子赋值零
if(i<=n) //i小于节点个数,即为初始节点,为其赋数据值
t[i].data=w[i];
else
t[i].data=0;
} //初始化完成,即为PPT中图一
for(i=1;i {
m1=m2=MAX; //MAX并无多大作用,只是作为一个初始比较值而已
x1=x2=0;
for(j=1;j<(n+i);j++) //每一次循环,不会对使用过的节点重复操作,因为其有了双亲,不满足t[j].pa0的条件
{
if((t[j].data0))
{
m2=m1;
x2=x1;
m1=t[j].data; //m1,m2存储节点数据值,x1,x2存储节点数
x1=j;
}
else if((t[j].data {
m2=t[j].data;
x2=j;
}
}
k=n+i; //开始构造根节点
t[x1].pa=t[x2].pa=k;
t[k].data=m1+m2; //根节点权值为左右子树根节点权值之和
t[k].lc=x1; //存储左节点数
t[k].rc=x2; //存储右节点数
}
for(i=1;i {
printf("%d “,t[i].lc);
printf(”%d “,t[i].data);
printf(”%d “,t[i].rc);
printf(”%d “,t[i].pa);
printf(”\n");
}
}

void main()
{
int w[M],i,n=0;
JD t[M];
printf(“please input the information of character\n”);
for(i=1;i {
scanf("%d",&w[i]);
}
for(i=1;i {
printf("%d",w[i]);
if(w[i]!=0)
n++;
}
printf("\n");
printf("%d",n);
printf("\n");
huffman(n,&w,&t);
getch();
}

你可能感兴趣的:(数据结构)