一.哈夫曼树的构造方法
1.首先要拿到一组数据及其权重,其中每个数据都作为一颗哈夫曼树(也可以被视为一个结点)。
2.在这些树中找到权重最小的两棵树,将其合并为一棵树。合并方法:将这两棵树的权重相加,权重和为一个新的结点,并且为原来两棵树的父节点(即新树的根节点)。然后在剩余的这些树中(第一次合并的两棵树不再存在于该数据群,取而代之的是他们的父节点)继续找到权重最小的两棵树进行合并,以此方法迭代直至生成一棵树,即最后的哈夫曼树。
二.生成哈夫曼编码
在哈夫曼树中,左子树的路径定义为0,右子树的路径定义为1。由此可以得到每一个数据的哈夫曼码。
三.实现文件压缩与解压
这里用哈夫曼树实现文件压缩实质是改变了文件的编码方式。比如原文件用100位编码表示,将其中每一个数据对应的编码用哈夫曼码替代后,该文件编码就只有70位,这就实现了文件压缩。
四.源码
注:当时写完就没有更改,里面存在一些无用的变量。文件路径也需自己指定
huffman_tree.h
#include <iostream>
#include <queue>
#include <string>
#ifndef _HUFFMAN_TREE_H_
#define _HUFFMAN_TREE_H_
using namespace std;
struct store{
unsigned char data;
int weight;
string code;
};
struct htnode{ //非叶子结点只记录权重,叶子结点需记录权重和数据
unsigned char data;
int weight;
string code;
htnode *lchild,*rchild;
};
struct cmp{ //重写仿函数
bool operator()(htnode* a,htnode* b){
return a -> weight > b -> weight; //权值小的在队列头
}
};
class huffman_tree{
private:
htnode *root;
public:
huffman_tree();
~huffman_tree();
void creat(struct store*,int);
void get_hcode(store*);
void hcode(htnode*,string,store* s);
void drop(htnode*);
void visit(htnode*);
htnode* get_root();
};
#endif
huffman_tree.cpp