8609 哈夫曼树
时间限制:1000MS 内存限制:1000K
提交次数:3178 通过次数:1263
题型: 编程题 语言: G++;GCC
Description
利用静态链表建立赫夫曼树,建树过程中要求左子树权值小于右子树权值,求各结点的编码。要求:叶子结点的个数n及结点值由键盘录入。本题给出程序代码,要求修改以满足测试要求.
#include <cstdio>
#include <cstdlib>
#include <string.h>
#include <iostream>
#define OK 1;
#define ERROR 0;
#define MAXINT 0x3f3f3f3f;
typedef int Status ;
using namespace std;
typedef struct
{
unsigned int weight;
unsigned int parent ,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char **HuffmanCode;
void display(HuffmanTree HT ,HuffmanCode HC,int n)
{
// for(int i=1;i<2*n;i++)
//cout<<HT[i].weight<<"\t"<<HT[i].parent<<"\t"<<HT[i].lchild<<"\t"<<HT[i].rchild<<endl;
for(int i=1;i<=n;i++)
cout<<HC[i]<<endl;
}
int Min(HuffmanTree &HT ,int n)
{
int sign;
unsigned int s ;
s=MAXINT;
for(int i=1;i<=n;i++)
{
if(HT[i].parent==0&&s>HT[i].weight)
sign=i,s=HT[i].weight;
}
HT[sign].parent=1;
return sign;
}
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int n,unsigned int *w)
{
HT=new HTNode[2*n];
for(int i=1;i<=n;i++) { HT[i].lchild=HT[i].rchild=HT[i].parent=0; HT[i].weight=w[i-1] ;}
for(int i=n+1;i<2*n;i++) {HT[i].parent=0;}
for(int i=n+1;i<2*n;i++)
{
int S1,S2;
S1=Min(HT,i-1); S2=Min(HT,i-1);
HT[i].lchild=S1; HT[i].rchild=S2; HT[i].weight=HT[S1].weight+HT[S2].weight;
HT[S1].parent=HT[S2].parent=i;
}
HC=(HuffmanCode)malloc((n+1)*sizeof(char *));
char ch[n+2];
ch[n+1]='\0';
for(int i=1;i<=n;i++)
{
int start=n;
for(int f=HT[i].parent,c=i; HT[c].parent!=0 ;)
{
if(c==HT[f].lchild) ch[start--]='0';
else ch[start--]='1';
c=f;
f=HT[f].parent;
}
HC[i]=new char[n];
strcpy(HC[i],&ch[start+1]);
}
}
int main()
{
int n;
cin>>n;
unsigned int *w;
w=(unsigned int *)malloc(n*sizeof(unsigned int));
for(int i=0;i<n;cin>>*(w+i),i++);
HuffmanCode HC;
HuffmanTree HT;
HuffmanCoding(HT,HC,n,w);
display(HT,HC,n);
}
#include <cstdio>
#include <cstdlib>
#include <string.h>
#include <iostream>
#define OK 1;
#define ERROR 0;
#define MAXINT 0x3f3f3f3f;
typedef int Status ;
using namespace std;
typedef struct
{
unsigned int weight;
unsigned int parent ,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char **HuffmanCode;
void display(HuffmanTree HT ,HuffmanCode HC,int n)
{
// for(int i=1;i<2*n;i++)
//cout<<HT[i].weight<<"\t"<<HT[i].parent<<"\t"<<HT[i].lchild<<"\t"<<HT[i].rchild<<endl;
for(int i=1;i<=n;i++)
cout<<HC[i]<<endl;
}
int Min(HuffmanTree &HT ,int n)
{
int sign;
unsigned int s ;
s=MAXINT;
for(int i=1;i<=n;i++)
{
if(HT[i].parent==0&&s>HT[i].weight)
sign=i,s=HT[i].weight;
}
HT[sign].parent=1;
return sign;
}
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int n,unsigned int *w)
{
HT=new HTNode[2*n];
for(int i=1;i<=n;i++) { HT[i].lchild=HT[i].rchild=HT[i].parent=0; HT[i].weight=w[i-1] ;}
for(int i=n+1;i<2*n;i++) {HT[i].parent=0;}
for(int i=n+1;i<2*n;i++)
{
int S1,S2;
S1=Min(HT,i-1); S2=Min(HT,i-1);
HT[i].lchild=S1; HT[i].rchild=S2; HT[i].weight=HT[S1].weight+HT[S2].weight;
HT[S1].parent=HT[S2].parent=i;
}
HC=(HuffmanCode)malloc((n+1)*sizeof(char *));
char ch[n+2];
ch[n+1]='\0';
for(int i=1;i<=n;i++)
{
int start=n;
for(int f=HT[i].parent,c=i; HT[c].parent!=0 ;)
{
if(c==HT[f].lchild) ch[start--]='0';
else ch[start--]='1';
c=f;
f=HT[f].parent;
}
HC[i]=new char[n];
strcpy(HC[i],&ch[start+1]);
}
}
int main()
{
int n;
cin>>n;
unsigned int *w;
w=(unsigned int *)malloc(n*sizeof(unsigned int));
for(int i=0;i<n;cin>>*(w+i),i++);
HuffmanCode HC;
HuffmanTree HT;
HuffmanCoding(HT,HC,n,w);
display(HT,HC,n);
}