赫夫曼编码
#include<iostream>
#include<queue>
#include<malloc.h>
#include<algorithm>
#define maxn 100005
using namespace std;
typedef struct{
int weight;
int parent,lchild,rchild;
HTNode(){}
HTNode(int a,int b,int d,int e){
weight=a;parent=b;
lchild=d;rchild=e;
}
}HTNode,*HuffmanTree;
struct node{
int ii;
int wight;
node(){}
node(int a,int b){ii=a;wight=b;}
bool operator < (const node & a) const{
if(wight==a.wight) return ii>a.ii;
return wight>a.wight;
}
};
int n;
char *cd=new char[n];
void huffmanC(HuffmanTree &HT,int parent,int deep){
if(HT[parent].lchild==0){
cd[deep]='\0';
cout<<cd<<endl;
return;
}
if(HT[parent].rchild==0){
cd[deep]='\0';
cout<<cd<<endl;
return;
}
if(HT[parent].lchild!=0) cd[deep]='0';
huffmanC(HT,HT[parent].lchild,deep+1);
if(HT[parent].rchild!=0) cd[deep]='1';
huffmanC(HT,HT[parent].rchild,deep+1);
return;
}
void HuffmanCoding(HuffmanTree &HT,int *w,int n){
if(n<=1) return;
int m=2*n-1;
HT=new HTNode[m+1];
priority_queue<node> ag;
HuffmanTree p;
int i=1;node w1;HTNode pp;
for(p=HT;i<=n;i++,p++,w++) pp.HTNode(*w,0,0,0),*p=pp,ag.push(node(i,*w));
for(;i<=m;i++,p++) pp.HTNode(0,0,0,0),*p=pp;
node cnt,kcnt;
for(i=n+1;i<=m;i++){
cnt=ag.top();ag.pop();
kcnt=ag.top();ag.pop();
HT[cnt.ii].parent=i,HT[kcnt.ii].parent=i;
HT[i].lchild=cnt.ii,HT[i].rchild=kcnt.ii;
HT[i].weight=cnt.wight+kcnt.wight;
cnt.ii=i;
cnt.wight=HT[i].weight;
ag.push(cnt);
}
huffmanC(HT,i-1,0);
}
int main(){
int w[maxn];
cout<<"叶子个数: ";
cin>>n;
cout<<"输入各个叶子的权重: "<<endl;
for(int i=0;i<n;i++){
cin>>w[i];
}
HuffmanTree HT;
HuffmanCoding(HT,w,n);
cout<<"叶权大的在下面"<<endl;
return 0;
}