哈夫曼应用

打印 上一主题 下一主题

主题 621|帖子 621|积分 1863

哈夫曼编码应用

问题描述

​       给定字符串,将每个不同的字符的哈夫曼编码表示并输出其哈夫曼编码,并再将其哈夫曼编码还原回字符串
分析一下

构建哈夫曼树
​        使用静态链表,先将所有的结点关系全部清零,再进行结点和相应权值的赋值,遍历后n-1个结点 (新根),从n个结点中选两个最小的权值了合成一棵树,并将新根加入到比较结点中(并将这两棵树标记以及结合,不再进行下次的比较),最后后合成一颗哈夫曼树
哈夫曼编码
​       在这里用到了一个大数组嵌套一个小数组,大数组I的功能是存放每一个结点的哈夫曼编码,小数组中存放每一个结点的没有个哈夫曼编码的反码
​       从叶子结点分别向根出发即可,若该结点时双亲结点的左孩子,则记0,反之记为1,记录在一个记录数组中直到该结点没有双亲(根结点),每遍历完一个结点后将记录数组复制到对应的小数组中。并及时清空记录数组进行下次使用。
​        在输出方面使用了多重的for循环,依次遍字符串,将字符串的每一个字符与结点进行比较,若相等则输出对应的(该结点)的哈夫曼编码,最后再用一数组接收,以便后续的使用
解码
​        依次遍历没有过哈夫曼遍历,从根结点出发,遇0向左,遇1则右,若到了叶子(无左孩子或无右孩子),则输出。并将更新结点值
看看代码吧

必没问题!!!(有问题就用个dev吧...)
[code]#include#define Max_S 1000000 #define MaxSize 100using namespace std;//静态链表 typedef struct TreeNode{        char data;    int weight;    int parent,lchild,rchild; }HTNode, *HuffmanTree; //编码数组 typedef struct{        int HC[MaxSize];}info,*Info;//一个大数组套一个小数组 //===========================================================//一些串和二叉树的算法 //求串长        int Strstrlen(char a[]){        int i = 1;        for(;a !='\0';){ i++; }        return i;} //字符串赋值 void StrAssige(char(&S)[MaxSize+1],char a[]){        S[0] = Strstrlen(a);        for(int i = 1;i = HT.weight){//次小的                 min = HT.weight;                s2 = i;             }        }    }    //若最小值相等,则浅(先遍历的)树的序号在前     int S1 = qiushendu(HT,s1);    int S2 = qiushendu(HT,s2);    if(S1 >= S2){            int temp;            temp = s1; s1 = s2; s2 = temp;//交换顺序         }        //用数组存放最小值和次小值     int a[3] = {0,s1,s2};    return a;}//===========================================================================//构建哈夫曼树 void CreatHuffmanTree(HuffmanTree &HT,char *huf,int *wei,int n){    int s1,s2;//最小值与极小值     if(n
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立聪堂德州十三局店

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表