Huffman二叉树及其代码分析
来源:互联网 发布:em253编程实例 编辑:程序博客网 时间:2024/06/07 05:49
霍夫曼编码(Huffman Coding)是可变长编码(VLC)的一种,于1952年由Huffman提出。Huffman编码属于无损压缩编码,且所编得的码为即时码,虽然编码方式不唯一,但是平均码长是确定且最短的。该编码方式广泛用于JPEG、MPEG等各种标准中。
Huffman码的原理非常简单,就是给概率大的码字分配短码,而给那些较少出现的码字分配长码。
这里以一张图做简要说明
就是一个对码字先依概率进行排序,然后构造一颗Huffman二叉树的过程。
然后对构造Huffman二叉树的C语言代码进行简要说明。
1.建立一些结构体
- //Huffman树结点类型
- typedef struct HFNODE
- {
- int w;
- struct HFNODE *lchild;
- struct HFNODE *rchild;
- }HfNode;
//typedef struct HFNODE HfNode;
同理
- //链表结点类型
- typedef struct LNODE
- {
- struct LNODE *pnext;
- HfNode *proot;
- }LNode;
2.相应的函数
紧接着有个构造二叉树的函数
- HfNode *Huffman(int n, int *w);
l = (LNode*)malloc(sizeof(LNode)); //创建头结点
- for ( i=0; i<n; i++ ){
- hnew = (HfNode*)malloc(sizeof(HfNode));
- hnew->w = w[i];
- hnew->lchild = NULL;
- hnew->rchild = NULL;
- OrderWeight(&l, hnew);
- }
其中OrderWeight(&l, hnew)的作用就是挂上所创建的节点。
最后该函数的返回值
h = (HfNode*)malloc(sizeof(HfNode)); return h;
返回的是个head节点的指针,并该返回值作为 void ReOrderTraverse(HfNode *h, int n) 的参数。
- void ReOrderTraverse(HfNode *ht, int n){
- if ( ht != NULL ){
- if ( ht->lchild == NULL && ht->rchild == NULL ){
- //TODO:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
- }
- ReOrderTraverse(ht->lchild, n + 1);
- ReOrderTraverse(ht->rchild, n + 1);
- }
- }
至此构造一颗Huffman二叉树的代码的原理就基本明了了。
-------------------学习笔记
阅读全文
0 0
- Huffman二叉树及其代码分析
- Huffman树及其应用
- huffman树及其应用
- Huffman树及其编码实现
- huffman树的分析
- Huffman树(二叉树)
- 二叉树和Huffman编码
- 线索二叉树及其Java代码实现
- [数据结构与算法]Huffman树及其应用
- 最优二叉树(哈弗曼(Huffman)树)
- 哈夫曼Huffman树(最优二叉树)
- 最优二叉树以及huffman编码
- 奇妙的二叉树:Huffman的贡献
- 奇妙的二叉树:Huffman的贡献
- 奇妙的二叉树:Huffman的贡献
- Huffman编码(二叉树的应用)
- 实验名称: :Huffman编码(二叉树应用)
- C++实现Huffman最优二叉树
- Reading books
- 读书笔记--Java语言程序设计基础12章异常-1
- 字符设备驱动程序
- 关于JSthis指向
- python基础之数据篇一
- Huffman二叉树及其代码分析
- 深度学习新星:GAN的基本原理、应用和走向
- 浅析静态库链接原理
- 移动web开发
- Spring-data-redis: pub/sub消息订阅
- 论物理学与技术革命之间的关系
- Effective Modern C++ :Item 1 -> 理解模板类型推断
- Excel VBA高效办公应用-第十章-高效处理学员资料-Part2 (考勤记录表)
- Giraph配置要点