Huffman编码:根据Huffman树进行编码的,用到的数据结构是二叉树。
typedef int elemtype;
typedef struct
{
elemtype weight;
int parent,l_child,r_child;
} binarytree;
//2、构建最优二叉树
void CreateHuffman(int leafnum, binarytree *huffmantree)
{
//leafnum个叶子,决定nodenum个结点数
int nodenum=2*leafnum-1;
huffmantree=(binarytree *)malloc(nodenum*sizeof(binarytree)); //0号单元也使用
//leafnum个叶子,决定nodenum个结点数,也决定了(nodenum-1)个bit位编码
char *huffmancode;
huffmancode =(char *)malloc((nodenum-1)*sizeof(char));
//huffmantree的初始化:叶子结点data权值手动输入,非叶子默认值都为0
cout<<"请输入叶子权值:";
int i;
for(i=0;i<nodenum;i++)
{
if(i<leafnum)
{
cin>>huffmantree[i].weight;
}
else
{
huffmantree[i].weight=0;
}
huffmantree[i].parent=huffmantree[i].l_child=huffmantree[i].r_child=0;
}
int j;
//j从leafnum开始,指的是包含了新建子树的结点编号
for(j=leafnum;j<nodenum;j++)
{
int w1=32767,w2=0; //存储最小权值;
int p=0,q=0; //存储最小权值的编号;
int k;
for(k=0;k<j;k++)
{
if(huffmantree[k].parent==0) //判断结点是否使用
{
if(huffmantree[k].weight<w1)
{
w2=w1;
q=p;
w1=huffmantree[k].weight;
p=k;
}
else if(huffmantree[k].weight<w2)
{
w2=huffmantree[k].weight;
q=k;
}
}
}
//p对应左节点,编码为‘0’;q对应左节点,编码为‘1’;
huffmancode[p]='0';
huffmancode[q]='1';
huffmantree[j].weight =w1+w2;
huffmantree[j].l_child=p;
huffmantree[j].r_child=q;
huffmantree[p].parent=j;
huffmantree[q].parent=j;
}
//3、寻找从子节点到根节点的编码 HuffmanCoding(int n,binarytree *HuffmanTree)
//针对每一个叶子,从叶子到根方向寻找huffmancode
//每一个叶子,对应的编码长度codelength
const int maxsize=10;
char iscode[maxsize][maxsize];
int m;
for(m=0;m<leafnum;m++) //从第一个叶子开始找
{
int n=0;
iscode[m][n]=huffmancode[m];
int parent=huffmantree[m].parent;
while(parent !=0)
{
iscode[m][++n]=huffmancode[parent];
parent=huffmantree[parent].parent;
};
int x;
cout<<"第"<<m+1<<"个叶子的HuffmanCode————";
for(x=0;x<n;x++)
cout<<iscode[m][x];
cout<<endl;
}
}
void main()
{
binarytree *T=0;
int leafnum;
printf("输入叶子数量n=\n");
cin>>leafnum;
CreateHuffman( leafnum, T);
while(1);
}
编译结果如下: