#icnlude<iostream> using namespace std;//每次都从权值中重新挑选最小的两位 typedef struct { int weight;//权值 int parent,lchild,rchild;//结点的双亲,左孩,右孩 }HTNode,*HuffmanTree; void Select(HuffmanTree HT,int end,&si,&s2) { int min1,min2; int i=1; while(HT[i].parent!=0&&i<=end)//找到第一个点 { i++; } min1=HT[i].weight; s1=i; i++; while(HT[i].parent!=0&&i<=end)//找到第二个点 { i++; } if(HT[i].weight<min1)//比较大小 ,如果更小,则,min1保留更小,min2保留一般小 {min2=min1; s2=s1; min1=HT[i].weight; s1=i; } else { min2=HT[i].weight; s2=i; } /*接着往下找*/ for(int j=i+1;j<=end;j++) { if(HT[i].parent!=0)//从剩余的点里找到更小的比较 continue; if(HT[i].weight<min1) { min2=min1; min1=HT[i].weight; s2=s1; s1=j; } else if(HT[i].weight>=min1&&HT[i].weight<min2) { min2=HT[j].weight; s2=j; } } } void CreateHuffmanTree(HuffmanTree &HT,int n) { if(n<=1) return; m=2*n-1;//有n个叶子结点的哈夫曼树有2n-1个结点 ???? HT=new HTNode[m+1];//0号坐标不使用,但有2n个结点,所以+1 for(int i=1;i<=m;i++)//初始化 { HT[i].parent=0; HT[i].lchild=0; HT[i].rchild=0; } //////////*创建部分*///////////// int s1=0,s2=0; for(int i=1;i<=m;i++) cin>>HT[i].weight;//输入各点的权值 for(int i=n+1;i<=m;++i) { Select(HT,i-1,s1,s2);//在HT[k](k>=1&&k<=i-1)里找两个双亲域为0,且权值最小的结点,并返回他们的序号 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; } }
0.0分
0 人评分
C语言程序设计教程(第三版)课后习题6.1 (C++代码)__gcd()是已经写好的函数,可以直接使用浏览:1997 |
众数问题 (C++代码)浏览:1288 |
点我有惊喜!你懂得!浏览:2114 |
2004年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:488 |
C语言训练-数字母 (C语言代码)浏览:610 |
简单的a+b (C语言代码)浏览:641 |
C语言程序设计教程(第三版)课后习题8.5 (C语言代码)浏览:956 |
C语言程序设计教程(第三版)课后习题8.4 (C语言代码)浏览:628 |
1025题解浏览:796 |
分糖果 (C语言代码)浏览:980 |