哈夫曼树的生成及哈夫曼编码
首先构造哈夫曼树结构体,初始化哈夫曼树的四个无符号整型域,输入文本,统计各个字符的权值,然后构建哈夫曼树,从根到叶子逆向求哈夫曼树的编码。
#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.文件读写 2.创建Huffman树 3.生成Huffman编码 4.压缩图片文件 5 . 解压缩图片文件 二.将项目分成三个小任务,下一任务是在上一任务 ...
- 【赫夫曼树详解】赫夫曼树简介及java代码实现-数据结构07
赫夫曼树(最优二叉树) 1. 简介 定义: 赫夫曼树是n个带权叶子结点构成的所有二叉树中,带权路径长度(WPL)最小的二叉树. 叶子结点的带权路径: 叶子结点权值*到根节点的路径长度(叶结点的层数) ...
- 【算法学习笔记】哈夫曼树的构建和哈夫曼编码的实现代码
介绍 哈夫曼(Haffman)这种方法的基本思想如下: ①由给定的n个权值{W1,W2,-,Wn}构造n棵只有一个叶子结点的二叉树,从而得到一个二叉树的集合F={T1,T2,-,Tn}. ②在F中选取 ...
- 数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)
目录 什么是哈夫曼树 哈夫曼树的定义 哈夫曼树的构造 图解操作 代码实现 代码解析 哈夫曼树的特点 哈夫曼编码 不等长编码 二叉树用于编码 哈夫曼编码实例 什么是哈夫曼树 我们先举个例子: 要将百分制 ...
- 【数据结构与算法】-哈夫曼树(Huffman Tree)与哈夫曼编码
超详细讲解哈夫曼树(Huffman Tree)以及哈夫曼编码的构造原理.方法,并用代码实现. 1哈夫曼树基本概念 路径:从树中一个结点到另一个结点之间的分支构成这两个结点间的路径. 结点的路径长度:两 ...
- 数据结构哈夫曼树实现26个英文字符的编码和译码
数据结构哈夫曼树实现26英文字符的编码和译码 那么首先什么是哈夫曼树?(知道的略过,直奔下面代码就好!) 在计算机数据处理中,霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编 ...
- 【哈夫曼树】牛客 哈夫曼树
题目描述 哈夫曼树,第一行输入一个数n,表示叶结点的个数.需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和. 输入描述: 输入 ...
- 数据结构C#版笔记--啥夫曼树(Huffman Tree)与啥夫曼编码(Huffman Encoding)
哈夫曼树Huffman tree 又称最优完全二叉树,切入正题之前,先看几个定义 1.路径 Path 简单点讲,路径就是从一个指定节点走到另一个指定节点所经过的分支,比如下图中的红色分支(A-> ...
- 哈夫曼树的构建及哈夫曼树编码
哈夫曼树的构建: 注意:(1).首先把一组数3 5 6 8 9 12 15从小到大排列 (2).选取里面最小2个,顶点出为2个数的和 (3).新产生的顶点在与原先的数字进行比较,在里面选取2个最小的数 ...
最新文章
- CDN的工作原理以及其中的一些技术-阿里
- Linux LVM卷挂载
- 硬件安全系列 逻辑电路基础知识介绍(三)
- commons-lang3工具类学习(一)
- 年轻人如何做好自己的人生规划?
- 数仓数据分层(ODS DWD DWS ADS)
- CSS3新增UI样式
- JavaScript 代码简洁之道
- 高效办公之远程电脑控制:再也不用带着厚重笔记本
- 外行也看得懂!了解量子计算的奇迹
- 我的Java学习历程03【Java8接口新特性-下】
- 新手如何在Git Hub上学习开源项目+社交
- 2022年下半年软考网络规划设计师下午真题及答案解析
- QPushButton QTableWidget QComBox属性设置
- unicode计算机通用解码语言
- 1. Resnet网络详解
- leetcode 971. Flip Binary Tree To Match Preorder Traversal
- Glew库 GLTools库
- QQ新功能,申请专属QQ号,申请QID教程
- cass10.1+鸿业生成平纵横数据