构造哈夫曼树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

posted @ 2017-03-11 17:21  夜梦多离殇  阅读(690)  评论(0编辑  收藏  举报