您的位置:首页 > 其它

用优先队列的huffman编码实现

2017-08-23 19:39 399 查看
#include<iostream>

#include<string> 

#include<queue>

#include<algorithm>

using namespace std;

struct huffman{

   int num;

   int weight;

   string s="";

   int parent;

   int lchild;

   int rchild;

huffman(){

}

huffman(int nu,int w,string ss,int p,int l,int r){
num=nu;
weight=w;
s=ss;
parent=p;
lchild=l;
rchild=r;

}

bool friend operator<(huffman a,huffman b){

return a.weight>b.weight;

}

};

huffman tree[100];

priority_queue<huffman>q;

void huffcode(huffman &t){

if(t.lchild!=-1){

 tree[t.lchild].s=t.s+'0';

tree[t.rchild].s=t.s+'1';

huffcode(tree[t.lchild]);

huffcode(tree[t.rchild]);

}else

return;

}

main(){
int n;

  cin>>n;

for(int i=0;i<n;i++){

cin>>tree[i].weight;

tree[i].num=i;

tree[i].parent=tree[i].lchild=tree[i].rchild=-1;

q.push(tree[i]);

}

for(int i=n;i<=2*n-2;i++){

huffman s1=q.top();

q.pop();

huffman s2=q.top();

q.pop();

huffman s3(i,s1.weight+s2.weight,"",-1,s1.num,s2.num);

q.push(s3);

tree[i]=s3;

tree[s1.num].parent=tree[s2.num].parent=i;

}

huffcode(tree[2*n-2]);

for(int i=0;i<n;i++)

cout<<tree[i].s<<" ";

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: