1.问题
2.解析
哈夫曼算法的基本思想是以字符使用频率作为权构建一棵哈夫曼树,然后利用哈夫曼树对字符进行编码。构造一棵哈夫曼树,是将所要编码的字符作为叶子节点,该字符的使用频率就作为叶子节点的权值,以自底向上的方式,通过n-1次合并运算后构造出的一棵树,核心思想是权值越大的叶子离根越近。
哈夫曼算法的贪心策略是每次从树的集合中取出没有双亲且权值最小的两棵树作为左右子树。
实例2:
3.设计
void BuildHuffmanTree(int n){
for(int i=0;i<n*2-1;i++){
//哈夫曼节点的初始化
huffman[i].weight=0;
huffman[i].parent=-1;
huffman[i].leftchild=-1;
huffman[i].rightchild=-1;
}
for(int i=0;i<n;i++){
printf("输入第%d个哈夫曼编码的字符和权重:\n",i+1);
scanf("%s%d",&huffman[i].ch,&huffman[i].weight);
}
//每次找出权重最小的节点,生成新的节点,需要n-1次合并
int a,b,w1,w2;
for(int i=0;i<n-1;i++){
a=b=-1;
w1=w2=10000;
for(int j=0;j<n+i;j++){
//注意每次在n+i里面遍历
//得到权重最小的点
if(huffman[j].parent==-1&&huffman[j].weight<w1){
//如果每次最小的更新了,那么需要把上次最小的给第二个最小的
w2=w1;
b=a;
a=j;
w1=huffman[j].weight;
}