//哈夫曼树的构建方法(MAXINT是一个很大的整数,大于所有权值之和)
PHTree huffman(int m, int *w){
PHTree pht;
int i,,j,x1,x2,m1,m2;
pht = (PHTree)malloc(sizeof(struct HtTree));
if(pht == NULL) {printf("Out of space!\n");return pht;}
pht->ht = (struct HtNode)malloc(sizeof(struct HtNode)*(2*m-1));//根据叶子节点的个数可以推出所有节点的个数为2*m-1
if(pt->ht == NULL) //先申请结构体
{
printf("Out of space!\n");
return pht;
}
for(i=0;i<2*m-1;i++){
pht->ht[i].llink = -1;
pht->ht[i].rlink = -1;
pht->ht[i].parent = -1;
if(i<m) pht->ht[i].ww = w[i]; //叶子节点先赋值
else pht->ht[i].ww = -1; //后面的节点初始化
}
for(i=0;i<m-1;i++){
m1 = MAXINT;
m2 = MAXINT;
x1 = -1; x2 = -1; //初始化各值
for(j=0;j<m+i;j++){
if(pht->ht[j].ww<m1 && pht->ht[j].parent==-1)//从第一个节点开始,对于每个i遍历到m+i,当m-2是就是最后一个节点。对于条件而言,每次只要遍历到权值小于当前最小值,并且还没有被组合的点满足条件
{
m2=m1; x2=x1; m1=pht->ht[j].ww; x1=j; //交换此时最小的权值并且记下它的下标,不要忘了次小的也即是之前的最小值
}
else if(pht->ht[j].ww<m2 && pht->ht[j].parent ==-1) //如果并未更新最小值,那么还需要检验次小值,这里任然需要判断是否已经组合
{
m2 = pht->ht[j].ww;x2 = j; //次小值直接交换
}
pht->ht[x1].parent = m+i; //将本次循环所得到的结果进行规整,进行一次构建
pht->ht[x2].parent = m+i; //左右儿子的双亲节点均要赋值成本次循环需要放的下标位
pht->ht[m+i].ww = m1 + m2; //将此次权值赋值
pht->ht[m+i].llink = x1; //将形成此二叉树的根节点的左右孩子赋值
pht->ht[m+i].rlink = x2;
}
pht->root = 2*m - 2; //最后是会循环到根节点的 因此要将结构体中的root赋值为最后的下标
return pht;
}
哈夫曼树
最新推荐文章于 2024-02-02 22:26:17 发布