• 哈夫曼树的构建—数据结构算法


    部分源码:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define M 8 
    typedef struct{
    char data;
    int weight;
    int parent,lchlid,rchlid;
    }HTNode,*HuffmanTree;
    
    
    int InitHTNode(HuffmanTree &HT,char da[],int w[]);
    int CreateTree(HuffmanTree &HT);
    int Select(HuffmanTree &HT,int& index,int cout);
    int CodeTree(HuffmanTree &HT,char code[][M]);
    int DeCodeTree(HuffmanTree &HT,char decode[]);
    
     
    
    int InitHTNode(HuffmanTree &HT,char da[],int w[]){
    int l=strlen(da);
    int m=2*l;
    HT=new HTNode[m];
    for(int i=1;i<m;i++){
    if(i<=l){
    HT[i].data=da[i-1];
    HT[i].weight=w[i-1];
    HT[i].parent=0;
    HT[i].lchlid=0;
    HT[i].rchlid=0;
    }else{
    HT[i].data=' ';
    HT[i].weight=0;
    HT[i].parent=0;
    HT[i].lchlid=0;
    HT[i].rchlid=0;
    }
    }
    }
    
    int CreateTree(HuffmanTree &HT){
    int index;
    int cout;
    for(int i=M+1;i<2*M;i++){
    cout=i;
    Select(HT,index,cout);//left
    HT[i].lchlid=index;
    HT[index].parent=i;
    HT[i].weight+=HT[index].weight;
    Select(HT,index,cout);//right
    HT[i].rchlid=index;
    HT[index].parent=i;
    HT[i].weight+=HT[index].weight;
    }
    }
    
    int Select(HuffmanTree &HT,int& index,int cout){
    int w=100;
    for(int i=1;i<cout;i++){
    if(HT[i].parent==0 && HT[i].weight!=0){
    if(HT[i].weight<w){
    index=i;
    w=HT[i].weight;
    }
    }
    }
    }
    
    int CodeTree(HuffmanTree &HT,char code[][M]){
    int p,c;
    for(int i=1;i<=M;i++){
    p=HT[i].parent;
    c=i;
    int cout=0;
    while(p!=0){
    if(HT[p].lchlid==c){
    code[i-1][cout]='0';
    }
    if(HT[p].rchlid==c){
    code[i-1][cout]='1';
    }
    c=p;
    p=HT[p].parent;
    cout++;
    }
    
    }
    }
    
    int DeCodeTree(HuffmanTree &HT,char decode[]){
    int l=strlen(decode);
    int index=2*M-1;
    for(int i=0;i<l;i++){
    if(decode[i]=='0'){
    index=HT[index].lchlid;
    if(HT[index].lchlid==0&&HT[index].rchlid==0){
    printf("%c",HT[index].data);
    index=2*M-1;
    }
    }
    else{
    index=HT[index].rchlid;
    if(HT[index].lchlid==0&&HT[index].rchlid==0){
    printf("%c",HT[index].data);
    index=2*M-1;
    }
    }
    }
    };
    

      

    注意这里仅为部分代码。没有main主函数 获取源码请关注“值南针”微信公众号:可用电脑微信关注或手机关注(要最新版微信pc端)。在电脑方便。直接下载源码。

    点击想要的算法

    点击下载直接就可以用的。

  • 相关阅读:
    [题解?]luogu_P1415拆分数列(dp(不懂
    [题解]luogu_P1070道路游戏(堆dp
    [题解]luogu_P2577午餐(贪心dp
    [题解]luogu_P2157学校食堂(状压dp
    [模板]线段树合并
    [题解]宝藏(状压
    [题解]NOI2010超级钢琴
    [题解]luogu_P2161_会场预约(线段树颜色相关
    【总结】LCA的4种求法
    SRM517-600加强版(DP)
  • 原文地址:https://www.cnblogs.com/honeynan/p/12215302.html
Copyright © 2020-2023  润新知