#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语言考试练习题_排列 (C++代码)浏览:1093 |
C语言训练-求s=a+aa+aaa+aaaa+aa...a的值 (C语言代码) 如果a<0,那就不是这个代码了,哈哈哈哈浏览:1249 |
C二级辅导-等差数列 (C语言代码)浏览:604 |
C语言程序设计教程(第三版)课后习题8.6 (C语言代码)浏览:549 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:989 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:824 |
1124题解浏览:597 |
矩形面积交 (C语言代码)浏览:1323 |
矩阵转置 (C语言代码)浏览:795 |
2003年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:624 |