哈夫曼树是由n个带权叶子节点构成的所有二叉树带权路径长度WPL最小的二叉树。
算法如下:
1. 由给定n个权值{w1,w2,…,wn}构造n棵只有一个叶子结点的二叉树,得到一个二叉森林即集合F={T1,T2,…,Tn}
2. 在F中选取根结点权值最小的两棵二叉树作为左右子树构造一棵二叉树,且置新树根结点的权值为左右子树的根结点权值之和
3. 在F中删去作为左右子树的这两课二叉树,并将新树加入F中
4. 重复2和3两步,直到F中只有一棵二叉树,此二叉树即为所要构造的哈夫曼树。
哈夫曼编码解码:
编码结构体

typedef struct
{
    int bit[MAXBIT];
    int start;
}HCodeType;

结点结构体

typedef struct
{
    int weight;
    int parent;
    int lchild;
    int rchild;
    int value;
}HNodeType;

构造一棵哈夫曼树

void HuffmanTree(HNodeType HuffNode[MAXNODE],int n)
{
int i,j,m1,m2,x1,x2;
for(i=0;i<2*n-1;i++)
{
    HuffNode[i].weight=0;
    HuffNode[i].parent=-1;
    HuffNode[i].lchild=-1;
    HuffNode[i].rchild=-1;
    HuffNode[i].value=i;
}
for(i=0;i<n;i++)
{
    printf("Please input weight of leaf node %d:\n",i);
    scanf("%d",&HuffNode[i].weight);
}
for(i=0;i<n-1;i++)
{
    m1=m2=MAXVALUE;
    x1=x2=0;
    for(j=0;j<n+i;j++)
    {
        if(HuffNode[j].weight<m1 && HuffNode[j].parent==-1)
        {
            m2=m1;
            x2=x1;
            m1=HuffNode[j].weight;
            x1=j;
        }
        else if(HuffNode[j].weight <m2 && HuffNode[j].parent==-1)
        {
            m2=HuffNode[j].weight;
            x2=j;
        }
    }
    HuffNode[x1].parent =n+i;
    HuffNode[x2].parent =n+i;
    HuffNode[n+i].weight=HuffNode[x1].weight+HuffNode[x2].weight;
    HuffNode[n+i].lchild=x1;
    HuffNode[n+i].rchild=x2;
}
}

解码

void decodeing(char string[],HNodeType Buf[],int Num)
{
    int i,tmp=0,code[1024];
    int m=2*Num-1;
    char *nump;
    char num[1024];
    for(i=0;i<strlen(string);i++)
    {
        if(string[i]=='0')
        num[i]=0;
        else
        num[i]=1;
    }
    i=0;
    nump=&num[0];
    while(nump<(&num[strlen(string)]))
    {
        temp=m-1;
        while((Buf[tmp].lchild!=-1)&&(Buf[tmp].rchild!=-1))
        {
            if(*nump==0)
            {
                tmp=Buf[tmp].lchild;
            }
            else tmp=Buf[tmp].rchild;
            nump++;
        }
        printf("%d",Buf[tmp].value);
    }
}