Huffman树
是一种带权路径长度最短的树,用途:Huffman编码、归并排序等.
二叉Huffman树
-
构造方法:
(1)确定n个有权值的结点构成的集合T(即Huffman树的所有叶子结点)(2)选取最小的两个结点作为新树的根结点的左右子树,新树的根节点权值为左右子树根节点之和
(3)在集合T中删除这两个作为子树根节点的结点,并把生成的新节点加入到集合T中
(4)重复(2)、(3)步骤直到集合T为空
-
应用: Huffman编码
(1)原理:利用权值越大的结点离Huffman树根节点越近的性质:出现频率越高的字符被编码后的长度越短.(2)方法:构造二叉Huffman树、然后把每一条到左子树的边标记为0,到右子树的边标记为1
-
代码实现(优先队列)
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
struct cmp
{
bool operator()(pair<char, int> a, pair<char, int> b)
{
return a.second > b.second; //与greater是等价的
}
};
void Huffman(vector<pair<char,int>> vec)
{
priority_queue<pair<char,int>, vector<pair<char,int>>, cmp> que