问答题 给定一组项及其权值,假定项都存放于二叉树的树叶结点,则具有最小带权外部路径长度的树称为Huffman树。(1)给出构造Huffman树的算法。(2)给定项及相应的权如下表,画出执行上述算法后得到的Huffman树。(3)用C语言编写构造Huffman树的程序。
【正确答案】正确答案:(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 ; //置左、右子女的双亲 }
【答案解析】