萌新学习笔记之哈夫曼树
来源:互联网 发布:c语言连接字符串 编辑:程序博客网 时间:2024/04/30 06:55
哈夫曼树的定义:
假设有n个权值{ w1,w2 , ... , wn},构造有n个叶结点的二叉树,每个叶结点的权值是n个权值之一,这样的二叉树可以构造很多棵,其中必有一棵是带权路径长度最小的,这棵二叉树就称为最优二叉树或哈夫曼树;typedef struct TreeNode* HuffmanTree;struct TreeNode{ int Weight; HuffmanTree Left; HuffmanTree Right;};
哈夫曼树的构造
(懒得写了,摘自百度百科,亲测很好):
假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为:(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);
(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
(3)从森林中删除选取的两棵树,并将新树加入森林;
(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。
这里还会需要一个最小堆,来提供每次取最小的两个,因为是数据结构C语言版,所以那个最小堆,STL的priority_queue也不能用,实现起来很繁,也就不实现;
HuffmanTree Huffman(MinHeap H) //假设H-size 个权值已经存在H ->Element[]->weight 里;{ int i; HuffmanTree T; BuildMinHeap(H); //将H -> Element[]按权值调整成最小堆 for(i=1 ; i< H->Size ; ++i) //做size-1次合并; { T=(HuffmanTree)malloc(sizeof(struct TreeNode)); //建立一个新结点 T->Left=DeleMin(H); //从堆中删除一个最小结点,然后作为左结点 T->Right=DeleMin(H); //同上 T->Weight=T->Left->Weight+T->Right->Weight; //计算新权值 Insert(H,T); //往最小堆插入新结点; } T=DeleMin(H); //最后从最小堆中取出; return T;}
0 0
- 萌新学习笔记之哈夫曼树
- 萌新学习笔记之线性表
- Java8学习笔记之新日期API
- C++之离港篇学习笔记之新特性
- 萌新二叉树学习笔记
- 萌新循环队列学习笔记
- 萌新笔记之堆(heap)
- 萌新笔记之插入排序
- 萌新笔记之交换排序
- java学习笔记(三十七)java新IO之Buffer
- java学习笔记(三十八)java新IO之IntBuffer
- opencv学习笔记之Mat,图像的新容器
- html5学习笔记之八(新的网络连接技术)
- IOS学习笔记58--IOS7新特性之XCODE
- vc学习笔记之建立一个新的窗口
- 《Guava学习笔记之二》:新集合类型
- C++11新特性学习笔记之移动构造函数
- Android学习笔记之启动一个新的Activity
- android xml自定义配置文字字体(转)
- Jquery的extend方法$.extend()学习
- 设计模式之翻译模式
- #DeepLearningBook#算法概览之二
- Python yield和Generators(生成器)
- 萌新学习笔记之哈夫曼树
- 工具类List转成数组
- [SSH]No result defined for action and result input 和 Struts2中关于值跳转input,而不执行action的问题
- Ajax学习笔记
- PostgreSql+PostGIS的安装
- 工具类数组转换List
- 异常
- c蓝桥杯高效实现十六进制转八进制
- 【编程开发】非对称加密算法