哈夫曼编码
#include <bits/stdc++.h>
using namespace std;
struct Node{
int key;
Node *lchild,*rchild;
string code="";
Node(int k){
key=k;
lchild=rchild=nullptr;
}
Node(int k,Node *l,Node *r){
key=k;
lchild=l;
rchild=r;
}
};
struct cmp{
bool operator()(Node *a,Node *b)
{
return a->key>b->key;
}
};
Node *root;
vector<Node *> nodes;
void createHuffman(vector<int> weights)
{
priority_queue<Node*,vector<Node*>,cmp> nodeQueue;
for(int i=0; i<weights.size(); i++){
Node *tm=new Node(weights[i]);
nodes.push_back(tm);
nodeQueue.push(tm);
}
while (nodeQueue.size() > 1) {
Node *left = (Node *)nodeQueue.top();
nodeQueue.pop();
Node *right = (Node *)nodeQueue.top();
nodeQueue.pop();
Node *parent=new Node(left->key + right->key, left, right);
nodeQueue.push(parent);
}
root = nodeQueue.top();
}
void output(Node *head) {
if(head == nullptr){
return;
}
cout<<head->key<<" ";
output(head->lchild);
output(head->rchild);
}
void encode(Node* node, string code){
if(node == nullptr){
return;
}
node->code = code;
encode(node->lchild, node->code+"0");
encode(node->rchild, node->code+"1");
}
string convertHuffmanCode(int index) {
return nodes[index]->code;
}
int main() {
vector<char> chars = {'A','B','C','D','E','F'};
vector<int> weights = {2,3,7,9,18,25};
createHuffman(weights);
encode(root,"");
for(int i=0; i<chars.size(); i++){
cout<<chars[i] <<":" << convertHuffmanCode(i)<<endl;
}
return 0;
}