文档介绍:#include<iostream>#include<string>#include<fstream>usingnamespacestd;#defineMax200//最大结点数目#defineINT10000charch[Max];//叶子结点信息(字符)inti,w[Max];//w为输入的权值数组typedefstruct{ unsignedintweight;//权值 unsignedintparent,lchild,rchild;}HTNode,*HuffmanTree;//动态分配数组存储赫夫曼树typedefchar**HuffmanCode;//动态分配数组存储赫夫曼编码表voidHuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,int*w,intn){//w存放n个字符的权值(均>0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC。 ints1,s2,j,min1,min2; if(n<=1) return; intm=2*n-1; HT=newHTNode[m+1];//0号单元未用 for(i=1;i<=n;++i)//赫夫曼树叶子结点的初始化 {  HT[i].weight=w[i]; HT[i].parent=0;  HT[i].lchild=0;    HT[i].rchild=0;  } for(i=n+1;i<=m;++i)//非叶子结点的初始化 {   HT[i].weight=0;  HT[i].parent=0;   HT[i].lchild=0;  HT[i].rchild=0; } for(i=n+1;i<=m;++i)//建赫夫曼树 {//在HT[1..i-1]选择parent为0且weight最小的两个结点,其序号分别为S1和S2  min1=min2=INT;  for(j=1;j<i;j++)   if(HT[j].parent==0&&(HT[j].weight<min1))   {  min1=HT[j].weight; s1=j; }     for(j=1;j<i;j++)     if(HT[j].parent==0&&(HT[j].weight<min2)&&j!=s1)  {  min2=HT[j].weight; s2=j;  }         HT[s1].parent=i;HT[s2].parent=i;   HT[i].lchild=s1;HT[i].rchild=s2;      HT[i].weight=HT[s1].weight+HT[s2].weight;   ch[i]='?';//非叶子结点的结点字符 } //从叶子到根逆向求每个字符的赫夫曼编码 HC=newchar*[n+1];//分配n个字符编码的头指针向量 char*cd=newchar[n];//分配求编码的工作空间 HT[i].lchild=s1;HT[i].rchild=s2; cd[n-1]='\0'; //编码结束符 for(i=1;i<=n;i++) //逐个字符求赫夫曼编码 {  intc,f,start=n-1;//编码结束符位置  for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)//从叶子到根逆向求编码