哈夫曼编码的详细内容可以看这个大佬:哈夫曼(huffman)树和哈夫曼编码
#include <bits/stdc++.h>
using namespace std;
typedef struct Node* node;
struct Node{
int value;
char tx;
node left,right;
Node(){
value = 0;
left = right = NULL;
}
};
struct cmp{
bool operator()(node a,node b){
return a->value > b->value;
}
};
priority_queue<node,vector<node>,cmp> Q;
string text;
map<char,int> book;
inline void CheckOne(){
map<char,int>::iterator it;
int num = 0;
for(it=book.begin() ; it!=book.end() ; ++it){
printf("%d: %c---%d\n",++num,(*it).first,(*it).second);
}
}
node Solved(node a,node b){
node c = new Node();
c->value = a->value + b->value;
c->left = a;
c->right = b;
return c;
}
inline void Q_Push(){
map<char,int>::iterator it;
for(it=book.begin() ; it!=book.end() ; ++it){
node p = new Node();
p->value = (*it).second;
p->tx = (*it).first;
Q.push(p);
}
}
void getCode(node rt,string code){
if(rt->left == NULL && rt->right == NULL){
cout << rt->tx << ": " << code <<endl;
return ;
}
getCode(rt->left,code+'0');
getCode(rt->right,code+'1');
}
inline void init(){
book.clear();
while(!Q.empty())Q.pop();
}
int main(){
init();
cin >> text;//读入文本串
for(int i=0 ; i<text.length() ; ++i){
char ch = text[i];
if(book.find(ch) != book.end())++book[ch];
else book.insert(make_pair(ch,1));
}
//CheckOne();//检查各字符权值
Q_Push();//将各字符权值数据封装入结构体并将指针push
node A,B;
while(Q.size() > 1){
A = Q.top();
Q.pop();
B = Q.top();
Q.pop();
Q.push(Solved(A,B));
}
node rt = Q.top();
Q.pop();
getCode(rt,"");//得到各字符对应的HuffmanCode
return 0;
}