算法学习笔记10——应用哈夫曼树构造最短的不等长编码方案

内容:
(1)设需要编码的字符集为{d1, d2, …, dn},它们出现的频率为{w1, w2, …, wn},应用哈夫曼树构造最短的不等长编码方案。
提示:
哈夫曼树(Huffman Tree),又叫最优二叉树,指的是对于一组具有确定权值的叶子结点的具有最小带权路径长度的二叉树。
哈夫曼树的构造算法:假设有n个权值,则构造出得哈夫曼树有n个叶子结点。n个权值分别设为w1,w2,…,wn,则哈夫曼树的构造规则为:
(1)将w1,w2,…,wn看成是有n棵树的森林(每棵树仅有一个结点);
(2)在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
(3)从森林中删除选取的两棵树,并将新树加入森林;
(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。
完整代码:

#include<iostream>
#include <stdlib.h>
using namespace std; 
struct huffman
{
   double weight;
   int lchild,rchild,parent;
};

int Select(huffman huff[],int i)	//用来在数组huff中获得权值最小的根结点 
{
   double min=11000;
   int min1;
   for(int k=0;k<i;k++)
   {
   	if(huff[k].weight<min&&huff[k].parent==-1)
   	{
   		min=huff[k].weight;
   	     min1=k;
   	}
   }
   huff[min1].parent=1;
   return min1;
}

void HuffmanTree(huffman huff[],double weight[],int n)	//建立哈夫曼树 
{
   for(int i=0;i<2*n-1;i++)	//初始化 
   {
   	huff[i].lchild=-1;
   	huff[i].parent=-1;
   	huff[i].rchild=-1;
   }
   for(int i=0;i<n;i++)	//构造n棵只含有根结点的二叉树 
   {
   	huff[i].weight=weight[i];
   }
   for(int k=n;k<2*n-1;k++)	//n-1次合并 
   {
   	int i1=Select(huff,k);	//得到当前权值最小的结点i1 
   	int i2=Select(huff,k);	//得到当前权值最小的结点i2 
   	huff[i1].parent=k;		//合并i1和i2两个结点为一棵新树的左右子树 
   	huff[i2].parent=k;
   	huff[k].weight=	huff[i1].weight+huff[i2].weight;
   	huff[k].lchild=i2;
   	huff[k].rchild=i1;
   }
}

void huffmancode(huffman huff[],int n)	//由哈夫曼树生成编码 
{
   string s;
   int j;
   for(int i=0;i<n;i++)
   {	
   	s="";
   	j=i;
   	while(huff[j].parent!=-1)	//当结点j不是根结点时循环 
   	{
   		if(huff[huff[j].parent].lchild==j)	//当结点j是其父结点的左孩子时 
   			s=s+"0";
   		else s=s+"1";
   		j=huff[j].parent;	
   	}
   	cout<<"权值为"<<huff[i].weight<<"的霍夫曼编码为:";
      for(int j=s.length()-1;j>=0;j--)	//将s逆序输出,得到结点i的编码 
      {
   	   cout<<s[j];
      }
      cout<<endl;
   }
}
int main()
{
   huffman h;
   int n;
   cout<<"请输入权值的个数"<<endl; 
   cin>>n;
   double *w = (double*)malloc(n*sizeof(double));
   cout<<"请分别输入n个权值:\n"<<endl;
   int i;
   for(i=0; i<n; ++i)
   {
   	cin>>w[i];
   }
   HuffmanTree(&h,w,n);
   huffmancode(&h,n); 
   return 0;
}

运行结果
算法学习笔记10——应用哈夫曼树构造最短的不等长编码方案_第1张图片

你可能感兴趣的:(算法学习笔记10——应用哈夫曼树构造最短的不等长编码方案)