#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
using namespace std;
typedef char **huffmancode;
typedef struct
{
int weight;
int patent,lchild,rchild;
}htnode,*huffmantree;
void select(huffmantree ht,int n,int &s1,int &s2)
{
int i=0;
int min1,min2;
for(int i=1;i<=n;i++)
{
if(ht[i].patent==0)
{
min1=i;
break;
}
}
for(int i=1;i<=n;i++)
{
if((ht[i].patent==0)&&(ht[i].weight<ht[min1].weight))
{
min1=i;
}
}
s1=min1;
for(int i=1;i<=n;i++)
{
if(ht[i].patent==0&&i!=s1)
{
min2=i;
break;
}
}
for(int i=1;i<=n;i++)
{
if((ht[i].patent==0)&&(i!=s1)&&(ht[i].weight<ht[min2].weight))
min2=i;
}
s2=min2;
}
void createhuffmantree(huffmantree &ht,int n)
{
if(n<=1)
return;
int s1,s2;
int m=2*n-1;
ht=new htnode[m+1];
for(int i=1;i<=m;i++)
{
ht[i].patent=0;
ht[i].rchild=0;
ht[i].lchild=0;
}
for(int i=1;i<=n;i++)
{
cin>>ht[i].weight;
}
for (int i=n+1;i<=m;i++)
{
select(ht,i-1,s1,s2);
ht[s1].patent=i;ht[s2].patent=i;
ht[i].lchild=s1;ht[i].rchild=s2;
ht[i].weight=ht[s1].weight+ht[s2].weight;
}
}
void createhuffmancode(huffmantree ht,huffmancode &hc,int n)
{
hc=new char*[n+1];
char *cd=new char[n];
cd[n-1]='\0';
int start,c,f;
for(int i=1;i<=n;i++)
{
start=n-1;
c=i;
f=ht[i].patent;
while(f!=0)
{
--start;
if(ht[f].lchild==c)
cd[start]='0';
else
cd[start]='1';
c=f;
f=ht[f].patent;
}
hc[i]=new char[n-start];
strcpy(hc[i],&cd[start]);
}
delete cd;
}
int main()
{
huffmantree ht;
huffmancode hc;
int n;
cout<<"请输入元素个数"<<endl;
cin>>n;
createhuffmantree(ht,n);
createhuffmancode(ht,hc,n);
for(int i=1;i<=n;i++)
{
cout<<hc[i]<<endl;
}
return 0;
}
霍夫曼树构造和霍夫曼编码打印代码C#
最新推荐文章于 2024-07-29 21:07:30 发布