题目:电文字符集D及各个字符出现概率F如下:
D={a,b,c,d,e,f,f,h}
F= {5,29,7,8,14,23,3,11}
编写程序:打印D各字符的Huffman编码。
程序:
Huffman.cpp文件
#include<iostream>
#include<vector>
#include<queue>
#include<string>
#include"huffam.h"
using namespace std;
int main()
{
//测试string类型的数据,频率是出现设为概率
TreeNode<string> w[8];
vector<TreeNode<string> > v1;
w[0].frequrcy=5;
w[0].ch="a";
w[1].frequrcy=29;
w[1].ch="b";
w[2].frequrcy=7;
w[2].ch="c";
w[3].frequrcy=8;
w[3].ch="d";
w[4].frequrcy=14;
w[4].ch="e";
w[5].frequrcy=23;
w[5].ch="f";
w[6].frequrcy=3;
w[6].ch="g";
w[7].frequrcy=11;
w[7].ch="h";
copy(w,w+8,back_inserter(v1));
TreeNode<string> re=huffman(v1);
cout<<"编码的结果为"<<endl;
printHufman(&re,"");
cout<<endl;
return 0;
}
huffam.h文件
#include<iostream>
#include<vector>
#include<queue>
#include<string>
using namespace std;
/*************
本霍夫曼编码函数是用模板写成的】
可以对一些例如int型,char型,string型
进行基本的编码.
****************/
template<typename T>
struct TreeNode
{
TreeNode()
{
lchild=rchild=0;
}
int frequrcy;
T ch;
TreeNode *lchild;
TreeNode *rchild;
};
//改变优先队列默认优先级的重载运算符函数,重载为全局函数
template<typename T>
bool operator >(const TreeNode<T> & left,const TreeNode<T> &rigth)
{
return (left.frequrcy>rigth.frequrcy);
}
template<typename T>
TreeNode<T> huffman(vector< TreeNode<T> > &c)
{
size_t n=c.size();
TreeNode<T> huffamNode;
priority_queue<TreeNode<T>,vector<TreeNode<T> >, greater<TreeNode<T> > > q;
//所有的结点插入优先队列中
for(int i=0;i<static_cast<int>(n);i++)
{
huffamNode=c[i];
//huffamNode.lchild=huffamNode.rchild=0;
q.push(huffamNode);
}
//核心代码,建树的过程
for( i=0;i<static_cast<int>(n-1);i++)
{
TreeNode<T> *tempNode=new TreeNode<T>;
TreeNode<T> *xNode=new TreeNode<T>;
TreeNode<T> *yNode=new TreeNode<T>;
xNode->frequrcy=q.top().frequrcy;
xNode->ch=q.top().ch;
xNode->lchild=q.top().lchild;
xNode->rchild=q.top().rchild;
tempNode->lchild=xNode;
q.pop();
yNode->frequrcy=q.top().frequrcy;
yNode->ch=q.top().ch;
yNode->lchild=q.top().lchild;
yNode->rchild=q.top().rchild;
tempNode->rchild=yNode;
q.pop();
tempNode->frequrcy=xNode->frequrcy+yNode->frequrcy;
q.push(*tempNode);
}
return q.top();
}
//输出编码的函数
template<typename T>
void printHufman(TreeNode<T> *root,string s)
{
if(root->lchild!=0)
printHufman(root->lchild,s+"0");
if(root->rchild!=0)
printHufman(root->rchild,s+"1");
if(root->rchild==0&&root->lchild==0)
cout<<"被编码对象"<<root->ch<<" "<<"频率"<<root->frequrcy<<" "<<"编码为"<<s<<endl;
}