zoukankan      html  css  js  c++  java
  • 哈夫曼树的构建—数据结构算法

    部分源码:

    #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端)。在电脑方便。直接下载源码。

    点击想要的算法

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

  • 相关阅读:
    祭蟑螂文
    端午随笔
    有感于一个用户的留言
    jQuery UI dialog插件出错信息:$(this).dialog is not a function
    @@ERROR, BEGIN TRY/CATCH and XACT_ABORT
    检索 COM 类工厂中 CLSID 为{0002450000000000C000000000000046} 的组件时失败,原因是出现以下错误: 80070005。
    【SSB】使用命令行来检测Broker是否正常通信
    C#保留2位小数总结
    引用了混乱的组件或类库可能会导致WCF代理类无法正确生成
    [转]从属性赋值到MVVM模式详解
  • 原文地址:https://www.cnblogs.com/honeynan/p/12215302.html
Copyright © 2011-2022 走看看