#include<iostream>
#include<stdlib.h>
#include<cstring>
using namespace std;
struct Huffman
{
int weight;
int parent;
int LChild;
int RChild;
};
struct HuffmanCode
{
char bits[100];
};
void Select(Huffman T[],int n,int &s1,int &s2)
{
int min,i;
for(i=1;i<=n;i++)
{
if(T[i].parent==0)
{
min=i;
break;
}
}
for(i=1;i<=n;i++)
{
if(T[i].parent==0)
{
if(T[i].weight<T[min].weight)
{
min=i;
}
}
}
s1=min;
//
for(i=1;i<=n;i++)
{
if(T[i].parent==0&&i!=s1)
{
min=i;
break;
}
}
for(i=1;i<=n;i++)
{
if(T[i].parent==0&&i!=s1)
{
if(T[i].weight<T[min].weight)
{
min=i;
}
}
}
s2=min;
}
void Init(Huffman T[],int w[],int n)
{
int i,s1,s2;
for(i=1;i<=n;i++)
{
T[i].weight=w[i];
T[i].parent=0;
T[i].LChild=0;
T[i].RChild=0;
}
for(i=n+1;i<=2*n-1;i++)
{
T[i].weight=0;
T[i].parent=0;
T[i].LChild=0;
T[i].RChild=0;
}
for(i=n+1;i<=2*n-1;i++)
{
Select(T,i-1,s1,s2);
T[i].weight=T[s1].weight+T[s2].weight;
T[s1].parent=i;
T[s2].parent=i;
T[i].LChild=s1;
T[i].RChild=s2;
}
cout<<"初始化完成!"<<endl;
}
void CreateCode(Huffman T[],HuffmanCode ST[],int n)
{
int c,start,p,i;
char cd[1000];
cd[n-1]='\0';
for(i=1;i<=n;i++)
{
start=n-1;
c=i;
p=T[i].parent;
while(p!=0)
{
start--;
if(T[p].LChild==c)
cd[start]='0';
else
cd[start]='1';
c=p;
p=T[p].parent;
}
strcpy(ST[i].bits,&cd[start]);
}
}
int main()
{
int n,i;
int w[1000];//用来存放权值
Huffman T[1000];
HuffmanCode ST[1000];
cout<<"请输入哈夫曼树的结点数: ";
cin>>n;
cout<<"接下来输入每个结点的权值:";
for(i=1;i<=n;i++)
cin>>w[i];
cout<<"接下来初始化一个哈夫曼树:"<<endl;
Init(T,w,n);
cout<<"接下来创建哈夫曼编码:"<<endl;
CreateCode(T,ST,n);
for(i=0;i<=2*n-1;i++)
cout<<T[i].weight<<' ';
cout<<endl;
for(i=1;i<=n-1;i++)
cout<<ST[i].bits<<' ';
}
哈夫曼树的构建和编码
猜你喜欢
转载自blog.csdn.net/weixin_43579811/article/details/89675164
今日推荐
周排行