【正确答案】正确答案:(1)哈夫曼树的构造过程: ①根据给定的n个权值{W
1
,W
2
,W
3
,…,W
n
}构成n棵二叉树的集合F={T
1
,T
2
,…,T
n
},其中每棵二叉树T
i
只有权值为W
i
的根结点,其左右子树均为空。 ②在F中选取两棵根结点的权值最小的树作左右子树构造一棵新二叉树,新二叉树根结点的权值为其左右子树上根结点的权值之和。 ③在F中删除这两棵树,同时将新得到的二叉树加入F中。④重复②和③,直到F中只剩一棵树为止。这棵树便是哈夫曼树。 (2)含有n个叶子结点的哈夫曼树共有2n一1个结点,采用静态链表作为存储结构,设置大小为2n一1的数组。核心语句段如下: for(i=0;i<2*n-1;i++} //置初值,结点的权、左右子女、双亲 {T[i].parent=一1;T[i].1c=一1 ; T[i].rc=一1; if(i<n)T[i].weight=w[i]; else T[i].weight=0; } for(i=n ; i<2*n一1 ; i++) //构造新二叉树 {pl=p2=0 ; smalll:small2=maxint ; //赋初值,p1、p2是最小和次小权值结点的下标 for(J=0; j<i;j++} if(T[j].weight<smalll&&T[j].parent==一1) //最小值 {p2=p1; small2=smalll ; pl=j;smalll=T[j].weight;} else if(T[j].weight<small2&&T[j].parent==一1) //次小值 (p2=j;small2=T[j].weight ;} T[i].weight=T[pl].weight+T[p2].weight; //合并成一棵新二叉树 T[i].ic=pl; T[i].rc=p2; //置双亲的左右子女 T[p1].parent=i ; T[p2].parent=i ; //置左、右子女的双亲 }
【答案解析】