首先构造哈夫曼树结构体,初始化哈夫曼树的四个无符号整型域,输入文本,统计各个字符的权值,然后构建哈夫曼树,从根到叶子逆向求哈夫曼树的编码。

#include"stdio.h"
#include"string.h"
#include"malloc.h"
#include"iostream"
using namespace std;
typedef struct{unsigned int weight;unsigned int parent,lchild,rchild;
}HTNode,*HuffTree;
typedef  char  **HuffCode;void Select(HuffTree &Ht, int m, int &S1, int &S2)
{/*Select函数,每次从前面数据中选择2个权值(weight值)最小的,将
最小的两个下标赋给s1,s2 */int j;S1 = 0;S2 = 0;for (j = 1; j <= m; j++){if (Ht[j].parent == 0 && Ht[j].weight != 0){if (Ht[j].weight<Ht[S1].weight)S1 = j;}}for (j = 1; j <= m; j++){if (Ht[j].parent == 0 && j != S1&&Ht[j].weight != 0){if (Ht[j].weight<Ht[S2].weight)S2 = j;}}} void HuffmanCoding(HuffTree &Ht,HuffCode &Hc,int n){  //哈夫曼编码函数
if(n<=1)return;
int m,i,s1, s2;
HuffTree p;
m =2*n-1;
Ht = (HuffTree)malloc((m + 1) * sizeof(HTNode));
char ch[100];
for (p = Ht + 1, i = 1; i <= m; ++i, ++p) {     //初始化哈夫曼树各个值 p->weight = 0;p->parent = 0;p->lchild = 0;p->rchild = 0;
}
cin >> ch;                                   //读入一段文本
for (int i = 0; ch[i] !='\0'; i++) {Ht[ch[i] - 'a'+1].weight++;               //当文本还没有结束时,统计各个字符的权值
}
for(i=n+1;i<=m;++i){                         //建哈夫曼树 Select(Ht,i-1,s1,s2);                      Ht[s1].parent=i;Ht[s2].parent=i;Ht[i].lchild=s1;Ht[i].rchild=s2;Ht[i].weight=Ht[s1].weight+Ht[s2].weight;
}// 从叶子到根逆向求每个字符的哈夫曼编码
Hc=(HuffCode)malloc((n+1)*sizeof(char*));
char * cd=(char*)malloc((n)*sizeof(char));
int c,f;
cd[n-1]='\0';                 //编码结束符
int start;
for(i=1;i<=n;++i){start=n-1;for(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';}//cd[n-1]='\0';Hc[i]=(char *)malloc((n-start)*sizeof(char));strcpy(Hc[i],&cd[start]);
}
free(cd);}void show(HuffCode &Hc, int n)//输出哈夫曼编码
{int i, k;cout<<"  输出哈夫曼编码:\n"; //输出哈夫曼编码  for (i = 1; i<=n; i++){cout<< Hc[i];cout<<"\n"; }}

然后在主函数中调用,加入输入输出语句即可

#include"1.h"using namespace std;int main()
{HuffTree ht;HuffCode hc;int n;cout << "请输入文本";HuffmanCoding(ht,hc,26);show(hc,26);system("pause");
}

哈夫曼树的生成及哈夫曼编码相关推荐

  1. 数据结构编程实践(七)创建哈夫曼树、生成哈夫曼编码、完成图片的压缩与解压缩

    一.对图片的压缩与解压缩,涉及以下内容: 1.文件读写 2.创建Huffman树 3.生成Huffman编码 4.压缩图片文件 5 .  解压缩图片文件 二.将项目分成三个小任务,下一任务是在上一任务 ...

  2. 【赫夫曼树详解】赫夫曼树简介及java代码实现-数据结构07

    赫夫曼树(最优二叉树) 1. 简介 定义: 赫夫曼树是n个带权叶子结点构成的所有二叉树中,带权路径长度(WPL)最小的二叉树. 叶子结点的带权路径: 叶子结点权值*到根节点的路径长度(叶结点的层数) ...

  3. 【算法学习笔记】哈夫曼树的构建和哈夫曼编码的实现代码

    介绍 哈夫曼(Haffman)这种方法的基本思想如下: ①由给定的n个权值{W1,W2,-,Wn}构造n棵只有一个叶子结点的二叉树,从而得到一个二叉树的集合F={T1,T2,-,Tn}. ②在F中选取 ...

  4. 数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)

    目录 什么是哈夫曼树 哈夫曼树的定义 哈夫曼树的构造 图解操作 代码实现 代码解析 哈夫曼树的特点 哈夫曼编码 不等长编码 二叉树用于编码 哈夫曼编码实例 什么是哈夫曼树 我们先举个例子: 要将百分制 ...

  5. 【数据结构与算法】-哈夫曼树(Huffman Tree)与哈夫曼编码

    超详细讲解哈夫曼树(Huffman Tree)以及哈夫曼编码的构造原理.方法,并用代码实现. 1哈夫曼树基本概念 路径:从树中一个结点到另一个结点之间的分支构成这两个结点间的路径. 结点的路径长度:两 ...

  6. 数据结构哈夫曼树实现26个英文字符的编码和译码

    数据结构哈夫曼树实现26英文字符的编码和译码 那么首先什么是哈夫曼树?(知道的略过,直奔下面代码就好!) 在计算机数据处理中,霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编 ...

  7. 【哈夫曼树】牛客 哈夫曼树

    题目描述 哈夫曼树,第一行输入一个数n,表示叶结点的个数.需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和. 输入描述: 输入 ...

  8. 数据结构C#版笔记--啥夫曼树(Huffman Tree)与啥夫曼编码(Huffman Encoding)

    哈夫曼树Huffman tree 又称最优完全二叉树,切入正题之前,先看几个定义 1.路径 Path 简单点讲,路径就是从一个指定节点走到另一个指定节点所经过的分支,比如下图中的红色分支(A-> ...

  9. 哈夫曼树的构建及哈夫曼树编码

    哈夫曼树的构建: 注意:(1).首先把一组数3 5 6 8 9 12 15从小到大排列 (2).选取里面最小2个,顶点出为2个数的和 (3).新产生的顶点在与原先的数字进行比较,在里面选取2个最小的数 ...

最新文章

  1. CDN的工作原理以及其中的一些技术-阿里
  2. Linux LVM卷挂载
  3. 硬件安全系列 逻辑电路基础知识介绍(三)
  4. commons-lang3工具类学习(一)
  5. 年轻人如何做好自己的人生规划?
  6. 数仓数据分层(ODS DWD DWS ADS)
  7. CSS3新增UI样式
  8. JavaScript 代码简洁之道
  9. 高效办公之远程电脑控制:再也不用带着厚重笔记本
  10. 外行也看得懂!了解量子计算的奇迹
  11. 我的Java学习历程03【Java8接口新特性-下】
  12. 新手如何在Git Hub上学习开源项目+社交
  13. 2022年下半年软考网络规划设计师下午真题及答案解析
  14. QPushButton QTableWidget QComBox属性设置
  15. unicode计算机通用解码语言
  16. 1. Resnet网络详解
  17. leetcode 971. Flip Binary Tree To Match Preorder Traversal
  18. Glew库 GLTools库
  19. QQ新功能,申请专属QQ号,申请QID教程
  20. cass10.1+鸿业生成平纵横数据

热门文章

  1. powershell真香
  2. Oracle中分页查询语句
  3. HDFS Federation与HDFS High Availability详解
  4. 什么是ThreadLocal
  5. OpenCV 【二十】给图像添加边界
  6. Linux下的Memcache安装(含libevent的安装)
  7. 跨站脚本攻击(XSS)FAQ
  8. ASP.NET遍历配置文件的连接字符串
  9. C++中struct的使用
  10. 【Qt】Log4Qt(三)源码分析