使用C++实现赫夫曼树

赫夫曼的作用和效果这里不再叙说,这里只是我的实现。

  • 实现原理

在数据结构(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 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值