哈夫曼树的构造算法,哈夫曼编码算法

#include<stdio.h>

#define MAX 100

#define MAXVALUE 500

typedef  struct

{  

int weight;

   int parent,lchild,rchild;

}node; /*哈夫曼树结点类型*/

 

/*-----------------------------以下部分定义哈夫曼编码存储结构-------------------------*/

typedef struct{

int start; //存放起始位置 

char bits[10+1]; //存放编码位串 

}codetype;

typedef struct{

char symbol; //存储字符 

codetype code;

}element;

void getMinElementLocal(node t[] ,int num , int *minLocal1 , int *minLocal2) ;

/*---------------------------------------------------------------------------------------------------*/

/*构建哈夫曼树。n为构建哈夫曼树的叶子结点个数,数组w存储每个叶子的权值,数组t存储构建好的哈夫曼树*/

void huffman(int n,int w[],node t[])

{

int m = 0 ;

int minLocal1 , minLocal2 ;

int i = 0 ;

node * nodes = NULL ;

if(n == 0) return ;

m = 2*n -1 ;

for(i = 1 ; i <= n ; i ++){

t[i].weight = w[i] ;

t[i].lchild = t[i].parent = t[i].rchild = -1 ;

}

for(; i <= m ; i ++){

t[i].weight = 0 ;

t[i].lchild = t[i].parent = t[i].rchild = -1 ;

}

for(i = 1 ; i <= n-1 ; i ++){

minLocal1 = minLocal2 = -2 ;

getMinElementLocal(t , n+i , &minLocal1 , &minLocal2) ;

t[n+i].weight = t[minLocal1].weight + t[minLocal2].weight ;

t[n+i].lchild = minLocal1 ;

t[n+i].rchild = minLocal2 ;

t[minLocal1].parent = n+i ;

t[minLocal2].parent = n+i ;

}

 

}

void getMinElementLocal(node t[] ,int num , int *minLocal1 , int *minLocal2){

int i = 0 ;

int temp1 = MAXVALUE ;

int temp2 = MAXVALUE ;

 

*minLocal1 = *minLocal2 = 0 ;

for(i = 1 ; i < num ; i ++){

if(t[i].weight <= temp1 && t[i].parent == -1){

temp1 = t[i].weight ;

*minLocal1 = i ;

}

}

for(i = 1 ; i < num ; i ++){

if(t[i].weight <= temp2 && t[i].parent == -1 && i != *minLocal1){

temp2 = t[i].weight ;

*minLocal2 = i ;

}

}

}

/*---------------------------------------------------------------------------------------------------*/

/*根据哈夫曼树,求哈夫曼编码表。tree存储哈夫曼树,table存储哈夫曼编码表,n为哈夫曼树叶子个数*/

void sethufcode(node tree[],element table[],int n)

 {    

int i,j,s,f; /* 和f分别指示tree中孩子和双亲的位置*/

   codetype c;/*时存放编码 */

for(i=1;i<=n;i++)/*次求叶子tree[i]的编码 */

{    

printf("%d:",tree[i].weight);

c.start=n+1;

         s=i;/*叶子tree[i]开始上溯 */

         while(tree[s].parent != -1)/*至上溯到树根为止 */

{    

f=tree[s].parent ;

c.bits[--c.start]= (s == tree[f].lchild)?'0':'1';

    s=f;

         }

         for(j=c.start ;j<n+1;j++)

               printf("%c",c.bits[j]);

         printf("/n");

         table[i].code=c;/*时编码复制到最终位置 */  

    

}

/*---------------------------------------------------------------------------------------------------*/

void main()

{  

node t[100];

int i,n,w[100];

element m[100];

printf("请输入结点数:");

scanf("%d",&n);

for(i=1;i<=n;i++)

{

printf("请输入第%d个结点权重:", i);

scanf("%d",&w[i]);

}

/*构造哈夫曼树*/

huffman(n ,w , t) ;

 

printf("序号 权重 双亲 左孩 右孩/n");  /*输出哈夫曼树*/

for(i=1;i<(2*n);i++)

printf("%-5d%-5d%-5d%-5d%-5d/n",i,t[i].weight,t[i].parent,t[i].lchild,t[i].rchild);

sethufcode(t,m,n); /*构造并输出哈夫曼编码表*/

 }

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值