哈夫曼树及其编码

哈夫曼树编码 代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct{
int weight;
int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char ** HuffmanCode;

void Select(HuffmanTree HT,int n,int &first,int &second)
{
    int min=100000;
    for (int i=0;i<n;i++){
        if(min>HT[i].weight&&HT[i].parent==0){
            first=i;
            min=HT[i].weight;
        }
    }
    min=100000;
    for (int i=0;i<n;i++)
    {
        if(min>HT[i].weight&&first!=i&&HT[i].parent==0){
            second=i;
            min=HT[i].weight;
        }
    }
}
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n)
{
    if(n<1) return;
    int m=2*n-1;
    HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
    for (int i=0;i<n;i++){
        HT[i].weight=w[i];
        HT[i].parent=HT[i].lchild=HT[i].rchild=0;
    }
    for(int j=n;j<m+1;j++){
        HT[j].weight=0;
        HT[j].parent=HT[j].lchild=HT[j].rchild=0;
    }
    for(int i=n;i<m;i++){
        int first,second;
        Select(HT,i,first,second);
        HT[i].lchild=first;
        HT[i].rchild=second;
        HT[first].parent=i;
        HT[second].parent=i;
        HT[i].weight=HT[first].weight+HT[second].weight;
        printf("%d(%d,%d)\n",HT[i].weight,HT[first].weight,HT[second].weight);
    }
    
    
    HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
    char *cd=(char*)malloc(sizeof(char)*(n+1));
    cd[n-1]='\0';
    for(int i=0;i<n;i++)
    {
        int start=n-1;
        for(int c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent){
            if(HT[f].lchild==c) cd[--start]='0';
            else cd[--start]='1';
        }
        HC[i]=(char *)malloc(sizeof(char)*(n-start));
        strcpy(HC[i],&cd[start]);
    }
    free(cd);
}
int main()
{
    int w[100],n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&w[i]);
    }
    HuffmanCode HC;
    HuffmanTree HT;
    HuffmanCoding(HT,HC,w,n);
    for(int i=0;i<n;i++)
    {
        printf("%s\n",HC[i]);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 什么是哈夫曼树(Huffman Tree)eg:将百分制的考试成绩转换为五分制的成绩if ( score < 60...
    Spicy_Crayfish阅读 2,142评论 1 1
  • 简介 哈夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树。 定义:给定 n 个权值作为 n 个叶子节点,构造...
    随时学丫阅读 3,250评论 0 1
  • 这篇文章收录在我的 Github 上 algorithms-tutorial,另外记录了些算法题解,感兴趣的可以看...
    Lindz阅读 8,914评论 1 6
  • 对于我们的日常操作压缩文件来说,通常都是将文件中的字符转换成压缩后的格式,但为什么能够解压回来,那是因为压缩后的数...
    Forget_ever阅读 4,260评论 0 8
  • 日常生活中经常会使用到文件压缩,但是基本很少有人会问到压缩是如何实现的。所谓的,就是把文本重新进行编码,减少不必要...
    ZhengYaWei阅读 3,069评论 2 15