算法源码之哈弗曼编码

本文没有论述哈弗曼编码的原理、过程。只是将其实现过程现于纸上,为更多朋友在紧急的时候提供方便。忘广大朋友提出批评与指正,后续将不断撰写常用的算法源码

#include<stdio.h>
#include<stdlib.h>

#define MAXVALUE  10

typedef struct HTNode{
 float weight;  //结点权重
 int parent;   //当前结点的父节点
 int LChild;  //当前结点的左子节点
 int RChild; //当前结点的右子节点
}HTNode;


void select(HTNode hTree[],int n,int *s1,int *s2){//选择较小的两个结点,这里将s1和s2的地址传递过去
  int i,j;
  float min1,min2;
  min1=min2=MAXVALUE;//要找两个较小的数
   for(i=0;i<n;i++){  //在树中找最小结点
   if(min1>hTree[i].weight&&hTree[i].parent==-1){//注意判断条件,hTree[i].parent==-1表示该节点还未被选过
    *s1=i;

   }
  }
  for(j=0;j<n;j++){  //在树中找次最小结点
   if(min2>hTree[j].weight&&hTree[j].parent==-1&&(*s1)!=j){
    *s2=j;
   }
  }
}

void crtHuffmanTree(HTNode hTree[],float p[],int r){//创建哈弗曼树
 
  int i,s1,s2,m;
 m=2*r-1;//有r个叶子结点,当整棵树构建完毕时,结点总数为m个
  for(i=0;i<r;i++){     //哈弗曼树的初态
  hTree[i].weight=p[i];
  hTree[i].LChild=-1;
  hTree[i].parent=-1;
  hTree[i].RChild=-1;
 }
 
 for(i=r;i<m;i++){
    select(hTree,i-1,&s1,&s2);//在树中找两个权值最小的,将下标值赋给s1,s2;
    hTree[i].weight=hTree[s1].weight+hTree[s2].weight;
 hTree[s1].parent=i;
 hTree[s2].parent=i;
 hTree[i].LChild=s1;
 hTree[i].RChild=s2;
 hTree[i].parent=-1;
 }
 for(i=0;i<m;i++){
  printf("%lf \n",hTree[i].weight);
 }
 printf("创建哈弗曼树完毕\n");
}

void main(){
 HTNode hTree[2*4-1] ;//测试,假设有4个节点
 float p[4]={2.00/5.00,1.00/5.00,1.00/5.00,1.00/5.00};//分别是这四个结点的权重
 crtHuffmanTree(hTree,p,4);
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值