电文译码
根据一棵哈夫曼树,将电文码翻译为对应的权重
首先建立一棵哈夫曼树
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 4
typedef struct HTnode{
int weight;
int parent,lchild,rchild;
}HTnode,*HFtree;
typedef char** HFcode;
void selectnode(HFtree HT,int n,int &s1,int &s2)//选择没有双亲,权重最小的两个
{
int i;
for(i=1;i<=n;i++)
{
if(HT[i].parent==0)
s1=i;
}
for(i=1;i<=n;i++)
{
if(HT[i].parent==0)
{
if(HT[i].weight<HT[s1].weight)
s1=i;
}
}
for(i=1;i<=n;i++)
{
if(HT[i].parent==0&&i!=s1)
s2=i;
}
for(i=1;i<=n;i++)
{
if(HT[i].parent==0)
{
if(HT[i].weight<HT[s2].weight&&i!=s1)
s2=i;
}
}
}
void initHFtree(HFtree &HT,int n,int *w)//建立哈夫曼树
{
int m=2*n-1;
HT=(HFtree)malloc((m+1)*sizeof(HTnode));
int i;
HT[0].weight=m;
for(i=1;i<=n;i++)
{
HT[i].parent=HT[i].lchild=HT[i].rchild=0;
HT[i].weight=w[i-1];
}
for(i=n+1;i<=m;i++)
HT[i].weight=HT[i].lchild=HT[i].rchild=HT[i].parent=0;
for(i=n+1;i<=m;i++)
{
int s1,s2;
selectnode(HT,i-1,s1,s2);
HT[i].weight=HT[s1].weight+HT[s2].weight;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[s2].parent=HT[s1].parent=i;
}
}
进行翻译
void translate(HFtree HT,int n,char *s)
{
int c=2*n-1;
for(int i=0;i<strlen(s);i++)
{
if(HT[c].lchild&&HT[c].rchild)
{
if(s[i]=='1') c=HT[c].rchild;
else c=HT[c].lchild;
if(HT[c].lchild==0&&HT[c].rchild==0)
{
printf("%d",HT[c].weight);
c=2*n-1;
}
}
}
}
5的哈希码是10
7的哈希码是0
2的哈希码是110
4的哈希码是111
int main()
{
int w[100]={7,5,2,4};
char s[100]="101110110111";
HFtree HT;
initHFtree(HT,N,w);
for(int j=1;j<=2*N-1;j++)
printf("%d: %2d %2d %2d %2d\n",j,HT[j].weight,HT[j].parent,HT[j].lchild,HT[j].rchild);
translate(HT,N,s);
}