哈夫曼树

//哈夫曼树的构建方法(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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值