本篇主要介绍如何利用哈夫曼编码使文件进行压缩、如何构建哈夫曼树
欢迎提出问题和建议
联系方式:blbagony@163.com
代码链接
哈夫曼树
- 树的结构(节点结构)。两个指向叶子节点的指针、一个权值、一个指向父节点的指针(用来构建哈夫曼码)
template <class T>
struct HuffmanNode{
T _wt;
HuffmanNode<T>* _left;
HuffmanNode<T>* _right;
HuffmanNode<T>* _prev;
/*构造函数*/
HuffmanNode(const T& w)
:_wt(w)
, _left(NULL)
, _right(NULL)
, _prev(NULL)
{}
};
构建树
- 首先我们从小堆(minHeap)中拿出最小的两个元素,用这两个元素的权值(weight)之和组成父节点权值,再将其父节点放入minHeap 中,当 minheap 中的节点只剩下 1 个时 hfm 树就构建完毕。其中 hfm 树根节点的 weight 是所有叶子节点 weight 之和。
huffman_tree 是构造出来的对象,size返回树中结点个数
每取一个 top 就 pop 一次,pop 函数自带调整。
取到最后一个时已经建立好 hfm 树。
while (huffman_tree.Size() > 1){
Node* huffman_node_left = huffman_tree.Top(); huffman_tree.Pop();
Node* huffman_node_right = huffman_tree.Top(); huffman_tree.Pop();
Node* parent = new Node(huffman_node_left->_wt + huffman_node_right->_wt);
parent->_left = huffman_node_left;
huffman_node_left->_prev = parent;
parent->_right = huffman_node_right;
huffman_node_right->_prev = parent;
huffman_tree.Push(parent);
}
_root = huffman_tree.Top();
- 重载
()
,因为需要比较 weight 的仿函数ÿ