哈夫曼树和哈夫曼编码

1.带权最短路径wpl
2.哈夫曼树是wpl最小的树,但树不一定唯一。左右子树交换,大于二的同权重的树的任意组合都会影响其唯一性。
3.n个叶子节点的总节点数为2n-1。
4.哈夫曼树的建立,每次将两个权重最小的树组合一个大树(小树消失,大树插入。这里的存在与否依据parent标记),直到还有一棵树为止。
5.4可知哈夫曼树没有度为1的结点,又**n**0=**n**2+1。所以可得结论3.
6.若数据量很大,可以通过最小堆来实现两个最小权重树的查找。
7.哈夫曼编码,对已建立的哈夫曼树编码,左边(verge)为0,右边为1,穿起来即可。

#define status  int
#define ok      1
#define error   0
#define MAXVALUE    10000 

typedef struct{
    int weight;
    int parent,lchild,rchild;
}HuTNode,*HuffmanTP;
typedef char**  HuffmanTreeCode;



status HuffmanCode(HuffmanTP &HT,HuffmanTreeCode &HC,int * w ,int n){
    if(n<=1)    return ok;
    int m,i,j,min,tmpweight,top,c,f;    HuffmanTP p;
    m=2*n-1;
    HT=(HuffmanTP)malloc(sizeof(HuTNode)*(m+1));    //0号位作哨兵
    if(!HT)     return error;
    for(i=1,p=HT;i<=n;i++){ //叶子节点初始化   
        (p+i)->weight=*(w+i);
        (p+i)->parent=0;
        (p+i)->lchild=0;
        (p+i)->rchild=0;
    }
    HT->parent=0;
    HT->weight=MAXVALUE;
    for(;i<=m;i++){     //非叶子节点初始化 
        (p+i)->weight=MAXVALUE;
        (p+i)->parent=0;
        (p+i)->lchild=0;
        (p+i)->rchild=0;
    }
    for(i=n+1;i<=m;i++){    //建立哈夫曼树
        min=0;  
        for(j=1;j<=m;j++){
            if((HT+j)->parent==0 && (HT+min)->weight>(HT+j)->weight)
                min=j;
        }

        tmpweight=(HT+min)->weight;
        (HT+min)->parent=i;
        (HT+i)->lchild=min;
        min=0;
        for(j=1;j<=m;j++){
            if((HT+j)->parent==0 && (HT+min)->weight>(HT+j)->weight)
                min=j;
        }
        (HT+min)->parent=i;
        (HT+i)->rchild=min;
        (HT+i)->weight=(HT+min)->weight+tmpweight;
    }

    //利用已编辑好的哈夫曼树进行哈夫曼编码    
    HC=(char**)malloc(sizeof(char*)*(n+1));
    char * cd;
    cd=(char*)malloc(sizeof(char)*n); //n个叶结点,最多编码n-1,还有一位留给'\0'
//  strcpy(cd+n-1,"\0");    // strcpy(s1,s2);中s1和s2都是字符数组的首地址,所以这里也该放地址,不是strcpy(cd[n-1],"\0"); 
    for(i=1;i<=n;i++){
        top=0;
        for(c=i,f=(HT+i)->parent;f!=0;c=f,f=(HT+f)->parent){
            if((HT+f)->lchild==c){ 
                strcpy(cd+top++,"0");
            } else{
                strcpy(cd+top++,"1");
            }   
        }
        HC[i]=(char*)malloc(sizeof(char)*(top+2));  
        strcpy(HC[i],cd);
    }
    free(cd);
    return ok;
}

status main(void){
    int i;
    HuffmanTP head;
    HuffmanTreeCode codes;
    int  ws[]={MAXVALUE,12,13,15,4,10,1,3};
    int n=7;
    HuffmanCode(head,codes,ws,n);
    for(i=1;i<=7;i++)
        printf("%s\n",codes[i]);
    return ok;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值