1.算法思想
哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的路径长度是从树根到每一结点的路径长度之和,记为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n)
2.算法实现
#include <stdio.h>
#include <stdlib.h>
//最小生成树 应用 哈夫曼编码
struct huffmannode
{
int weight;
int tag,LeftChild,RightChild;
};
typedef struct huffmannode Huffmannode;
void InitHuffmannode(Huffmannode *h,int t,int l,int r)
{
h->tag=t;
h->LeftChild=l;
h->RightChild=r;
}
struct huffmantree
{
int root;
};
typedef struct huffmantree Huffmantree;
void InitHuffmantree(Huffmantree *ht,int r)
{
ht->root=r;
}
//创建哈夫曼树
void makeHuffmantree(Huffmantree *ht,int a[],Huffmannode b[],int n)
{
int i,j,m1,m2,x1,x2;
//逐步构造 Huffman 树*/
for(i=0; i<n; i++)
b[i].weight=a[i];
for(i=1; i<n-1; i++)
{
m1=m2=32767; //m1, m2 是任何权都大的 整数*/
x1=x2=-1;
for(j=0; j<n+i-1; j++)
{
if(b[j].weight<m1&&b[j].tag==0)
{
m2=m1;
x2=x1;
m1=b[j].weight;
x1=j;
}
else if(b[j].weight<m2&&b[j].tag==0)
{
m2=b[j].weight;
x2=j;
}
}
b[x1].tag=1;
b[x2].tag=1;
//构造子树
b[n-1+i].weight=b[x1].weight+b[x2].weight;
b[n-1+i].LeftChild=x1;
b[n-1+i].RightChild=x2;
b[n-1+i].tag=0;
}
ht->root=2*n-2;
}
//哈夫曼编码就是利用哈夫曼树生成前缀唯一的不等长编码(从根部开始左子树是0右子树为1)
int main()
{
printf("哈夫曼编码就是利用哈夫曼树生成前缀唯一的不等长编码(从根部开始左子树是0右子树为 \n");
return 0;
}