我写了个大概。。。还是要你自己写得。你看看吧。。
// bt.cpp: 主项目文件。
#include "stdafx.h"
#include "iostream"
#include "iterator"
#include "String"
#define max 20
using namespace std;
struct node
{
char ch;
int weight;
int parent;
int lchild,rchild;
}Ht[2*max];
class htree
{
private:
int c[128];
int j;
int len;
char **Hc;
char code[20];
char ch[1000];
public:
htree()
{ j=1;
int i=0;
memset(c,0,sizeof(int)*128);
istream_iterator<char >
p(cin),eof;
while(p!=eof)
{
ch[i++]=*p;
c[*p++]++;
}
ch[i]='\0';
for(int i=0;i<128;i++)
if(c[i]!=0)
{
Ht[j].ch=i;
Ht[j].weight=c[i];
Ht[j].lchild=0;
Ht[j].rchild=0;
j++;
}
}
void Init()
{
for(int i=1;i<j-1;i++)
for(int k=1;k<j-1;k++)
if(Ht[k].weight>Ht[k+1].weight)
{
struct node tmp=Ht[k];
Ht[k]=Ht[k+1];
Ht[k+1]=tmp;
}
for(int i=1,k=0;i<j-1;i++,k++)
{
if(k==0)
{
Ht[j+k].lchild=i;
Ht[j+k].rchild=i+1;
Ht[i].parent=j+k;
Ht[i+1].parent=j+k;
Ht[j+k].weight=Ht[i+1].weight+Ht[i].weight;
}
else
{
Ht[j+k].lchild=j+k-1;
Ht[j+k-1].parent=j+k;
Ht[j+k].rchild=i+1;
Ht[i+1].parent=j+k;
Ht[j+k].weight=Ht[i+1].weight+Ht[j+k-1].weight;
}
if(i==j-2)
len=j+k;
}
}
void leafcode()
{
int i,p=len,cdlen=0;
Hc=(char * *)malloc(j*sizeof(char *));
for(int i=1;i<=p;i++)
Ht[i].weight=0;
while(p)
{
if(Ht[p].weight==0)
{
Ht[p].weight=1;
if(Ht[p].lchild!=0)
{
p=Ht[p].lchild;
code[cdlen++]='0';
}
else if(Ht[p].rchild==0)
{
Hc[p]=(char*)malloc((cdlen+1)*sizeof(char));
code[cdlen]='\0';
strcpy(Hc[p],code);
}
}
else if(Ht[p].weight==1)
{
Ht[p].weight=2;
if(Ht[p].rchild!=0)
{
p=Ht[p].rchild;
code[cdlen++]='1';
}
}
else
{
Ht[p].weight=0;
p=Ht[p].parent;
--cdlen;
}
}
for(int i=1;i<j;i++)
{
printf("%s=%c
",Hc[i],Ht[i].ch);
}
}
void ctob()
{
int i=0;
while(ch[i]!='\0')
{
for(int k=1;k<j;k++)
if(ch[i]==Ht[k].ch)
{
printf("%s
",Hc[k]);
break;
}
i++;
}
}
};
int main()
{
htree h;
h.Init();
h.leafcode();
h.ctob();
system("pause");
return 0;
}
要是有什么问题,可以一起讨论。。我没怎么测试。。