12.8
include
include
include
include<unordered_map>
using namespace std;
struct HuffmanNode{
int weight;
int originalWeight;
HuffmanNode *left;
HuffmanNode *right;
HuffmanNode(int w):weight(w),originalWeight(w),left(nullptr),right(nullptr){};
HuffmanNode(int w,HuffmanNode *l,HuffmanNode *r):weight(w),originalWeight(-1),left(l),right(r){};
};
struct CompareNode{
bool operator()(HuffmanNode *a,HuffmanNode b){
return a->weight>b->weight;
}
};
void generateCodes(HuffmanNode node,string code,unordered_map<int,string>&codeMap){
if(!node)return;
if(!node->left&&!node->right){
codeMap[node->originalWeight]=code;
return;
}
generateCodes(node->left,code+"0",codeMap);
generateCodes(node->right,code+"1",codeMap);
}
int calculateWPL(HuffmanNode node,int depth){
if(!node)return 0;
if(!node->left&&!node->right){
return node->weightdepth;
}
return calculateWPL(node->left,depth+1)+calculateWPL(node->right,depth+1);
}
int main(){
int n;
cin>>n;
if(n<=1){
cout<<"error"<<endl;
return 0;
}
vector
for(int i=0;i<n;++i){
cin>>weights[i];
}
priority_queue<HuffmanNode
for(int w:weights){
minHeap.push(new HuffmanNode(w));
}
while(minHeap.size()>1){
HuffmanNode left=minHeap.top();
minHeap.pop();
HuffmanNoderight=minHeap.top();
minHeap.pop();
HuffmanNode parent=new HuffmanNode(left->weight+right->weight,left,right);
minHeap.push(parent);
}
HuffmanNoderoot=minHeap.top();
unordered_map<int,string>codeMap;
generateCodes(root,"",codeMap);
int wpl=calculateWPL(root,0);
for(int w:weights){
cout<<w<<"编码为"<<codeMap[w]<<endl;
}
cout<<"WPL:"<<wpl;
return 0;
}

浙公网安备 33010602011771号