#include<bits/stdc++.h>
using namespace std;//哈夫曼树及其编码
const int MAX=10;
const int MAXF=10000;
//哈夫曼树
typedef struct{
int weight;
int lchild,rchild,parent;
}HFMtree;
//哈夫曼编码
typedef struct{
int weight;
int data[MAX];
int start;//start为哈夫曼编码初始位置
}HFMcode;
//构建哈夫曼树a,用b储存哈夫曼编码,c为权值,n为结点数
void HFMansf(HFMtree *(*a),HFMcode *(*b),int *c,int n)
{
if(n<=1)
return;
int m=2*n-1;//结点总数
int xb1,xb2;
int i,j;
*a=new HFMtree [m];
for(i=0;i<n;i++){
(*a)[i].weight=c[i];
(*a)[i].lchild=(*a)[i].rchild=(*a)[i].parent=-1;
}//初始化叶子结点
for(i=n;i<m;i++){
(*a)[i].lchild=(*a)[i].rchild=(*a)[i].parent=-1;
}
int min1,min2;
for(i=n;i<m;i++){
min1=min2=MAXF;
for(j=0;j<i;j++){//找到两个权值最小的结点
if((*a+j)->parent==-1&&(*a+j)->weight<min1){
min2=min1;xb2=xb1;min1=(*a+j)->weight;
xb1=j;
}
else if((*a+j)->parent==-1&&(*a+j)->weight<min2){
min2=(*a+j)->weight;xb2=j;
}
}
(*a+xb1)->parent=(*a+xb2)->parent=i;
(*a+i)->weight=min1+min2;
(*a+i)->lchild=xb1;(*a+i)->rchild=xb2;
}
*b=new HFMcode [n];
int start;
int f,d;
for(i=0;i<n;i++){
f=(*a+i)->parent;
(*b+i)->weight=c[i];
d=i;
start=n;
while(f!=-1){
if((*a+f)->lchild==d)
(*b+i)->data[--start]=0;
else
(*b+i)->data[--start]=1;
d=f;f=(*a+d)->parent;
}
(*b+i)->start=start;
}
}
int main()
{
HFMcode *b;HFMtree *a;int n=6;
int c[]={7,8,4,3,2,6};
HFMansf(&a,&b,c,n);
int i,j;
for(i=0;i<n;i++)
{
cout<<"权值:"<<(b+i)->weight<<'\n'<<"编码:";
for(j=(b+i)->start;j<n;j++)
cout<<(b+i)->data[j];
cout<<endl;
}
}
哈夫曼树
最新推荐文章于 2025-03-13 00:08:53 发布