赫夫曼的作用和效果这里不再叙说,这里只是我的实现。
- 实现原理
在数据结构(C语言版)中有详细的描述关于如何创建一颗赫夫曼树,也就是赫夫曼算法:
**(1)根据给定的n个权值构成n棵二叉树集合F,每棵二叉树的左右节点为空。
(2)在F中选取两棵根节点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根节点的权值为其左右子树上根节点的权值之和。
(3)在F中删除这两棵树,同时将新得到的二叉树插入F中。
(4)重复(2)和(3),直到F中只含一棵树为止。这棵树便是赫夫曼树。**
- 结构体声明和类声明
struct Hfm_info
{
Hfm_info(int a=0,char='\0');//构造函数
int weight; //权值
char ch; //字符
};
这个结构体表示基本的节点信息,weight表示权值,ch表示字符。这里的构造函数是为了创建结构体方便,后面会说到这个问题。
struct Hfm_node
{
Hfm_info hfm_info;
Hfm_node *left;
Hfm_node *right;
};
哈夫曼树的节点结构体,left表示左子树,right表示右子树。
typedef list<Hfm_node *>::iterator Hfm_iterator;
这个typedef为了代码的书写方便,因为我使用了STL中的list容器来存储节点信息。
下面是赫夫曼树的类声明:
class Hfm_tree
{
public:
Hfm_tree(const vector<Hfm_info>&);//构造函数
~Hfm_tree();//析构函数
void print();//打印字符的赫夫曼编码
private:
Hfm_node *get_new_node(const Hfm_info&);//new一个Hfm_node结构体
void create_tree(); //完成主要的工作
void get_need_iterator(Hfm_iterator &min,Hfm_iterator &b_min);//得到集合中最小的连个权值的迭代器
void destory(Hfm_node *);//帮助析构函数释放内存
void prt(const Hfm_node *,int);//完成主要的打印工作
Hfm_tree(const Hfm_tree&); //forbid ==
void