构造哈夫曼树C语言实现
#include <stdio.h> #include <stdlib.h> #include <assert.h> const int n=10;//定义最大的节点数 typedef struct node{ float w; int parent,l,r; }NODE; typedef NODE hTree[n*2-1]; void hfTree(int k,float w[],hTree T){ int x,y,i,j; float m,n; for(i=0;i<k*2-1;i++){ T[i].parent=-1; T[i].l=-1; T[i].r=-1; if(i<k) T[i].w=w[i];//权值 else T[i].w=-1.0;//权值,根据后面的算法,这个值是什么都无所谓的,因为后面会重新赋值 } for(i=0;i<k-1;i++){//进行k-1次生成树 x=y=0;m=n=1.0; //注意m和n必须大小或等于输入权值里权值最大的数.示例数据的权值都小于1. for(j=0;j<k+i;j++){//寻找两个权值最小的节点索引. if(T[j].w<m&&T[j].parent==-1){ n=m;m=T[j].w;y=x;x=j; } else if(T[j].w<n&&T[j].parent==-1){ n=T[j].w;y=j; } } T[k+i].l=x;//新节点指向两个子节点 T[k+i].r=y; T[k+i].w=T[x].w+T[y].w;//新节点的权重等于两个子节点的权重.或直接加上m+n T[x].parent=k+i;//为x,y两个节点添加父节点索引. T[y].parent=k+i; } for(i=0;i<k*2-1;i++) printf("%d:%f\n",i,T[i].w); } int main(){ float w[]={0.1,0.01,0.05,0.2,0.06,0.1,0.3,0.02,0.11};//k=9 hTree T; hfTree(9,w,T); return 0; }
程序输出:
Success time: 0 memory: 15240 signal:0 0:0.100000 1:0.010000 2:0.050000 3:0.200000 4:0.060000 5:0.100000 6:0.300000 7:0.020000 8:0.110000 9:0.030000 10:0.080000 11:0.140000 12:0.200000 13:0.250000 14:0.400000 15:0.550000 16:0.950000
注意:这里的权值是用的概率数,概率数最大值为1.如果是其它权值数,则需要将m和n设定了一个最大的权值数.
该程序通过测试:
http://ideone.com/l4k8qg