哈夫曼树源代码说课讲解.docVIP

  • 6
  • 0
  • 约7.25千字
  • 约 9页
  • 2020-09-09 发布于浙江
  • 举报
#includeiostream #includestring #includefstream using namespace std; #define Max 200 //最大结点数目 #define INT 10000 char ch[Max]; //叶子结点信息(字符) int i,w[Max]; //w为输入的权值数组 typedef struct{ ?unsigned int weight; //权值 ?unsigned int parent,lchild,rchild; }HTNode,*HuffmanTree; //动态分配数组存储赫夫曼树 typedef char * *HuffmanCode; //动态分配数组存储赫夫曼编码表 void HuffmanCoding(HuffmanTree HT,HuffmanCode HC,int *w,int n) {//w存放n个字符的权值(均0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC。 ?int s1,s2,j,min1,min2; ?if(n=1)? return; ?int m=2*n-1; ?HT=new HTNode[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;ji;j++) ???if(HT[j].parent==0(HT[j].weightmin1)) ???{?? min1=HT[j].weight;? s1=j;? } ????? for(j=1;ji;j++) ????? if(HT[j].parent==0(HT[j].weightmin2)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=new char*[n+1]; //分配n个字符编码的头指针向量 ?char *cd=new char[n]; //分配求编码的工作空间 ?HT[i].lchild=s1; HT[i].rchild=s2; ?cd[n-1]=\0;? //编码结束符 ?for(i=1;i=n;i++)? //逐个字符求赫夫曼编码 ?{ ??int c,f,start=n-1;//编码结束符位置 ??for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent) //从叶子到根逆向求编码 ???if(HT[f].lchild==c)? ????cd[--start]=0; ???else ????cd[--start]=1; ???HC[i]=new char[n-start];//为第i个字符编码分配空间 ???strcpy(HC[i],cd[start]); //从cd复制编码(串)到HC ?} ???? delete cd; } void Initialization(HuffmanTree HT,HuffmanCode HC,int n)//初始化,注意加引用符号 { ? char c; ???? ifstream fin(hfmTree.txt,ios::in);//读出? ???? if(fin.fail()) //若不存在此文件,则从终端读入 ? { ???????? cout请输入字符个数n:; ?? cinn; ?? cout请输入字符及相应权值:endl; ?? for(i=1;i=n;i++)//注意点 ?? {? ??? //getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和tab)。 ???????????? getchar(); //取消换行符 ??

文档评论(0)

1亿VIP精品文档

相关文档