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

    点击想要的算法

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

  • 相关阅读:
    [C++] 习题 2.18 倒序查找字串
    [C++] 二叉树计算文件单词数
    [C++] 例题 2.7.1 用栈实现简易计算器
    [C++] 非递归实现前中后序遍历二叉树
    [C++] 习题 2.15 实现简单环形队列
    数据结构、算法及应用
    [C++] 习题 2.14 用队列实现桶排序
    svn add 所有文件的命令
    解决Error opening terminal: xterm.的错误
    linux下删除项目中所有.svn的命令
  • 原文地址:https://www.cnblogs.com/honeynan/p/12215302.html
Copyright © 2011-2022 走看看