学习笔记|C++|数据结构|哈夫曼树,哈夫曼编码

本文介绍了使用C++的STL priority_queue构建哈夫曼树的过程,重点讲解了如何利用小顶堆实现哈夫曼树的构建,并探讨了重载运算符 '<' 的作用,以及在构建哈夫曼编码时的先序遍历方法。
摘要由CSDN通过智能技术生成

今天把哈夫曼树又实现了一遍。主要使用了C++的STL的priority_queue优先队列实现哈夫曼树的构建。优先队列的底层其实是小顶堆(或大顶堆),哈夫曼树的构建用到的是小顶堆啦,因为每次都是从优先队列中弹出最小的两个元素,也就是小顶堆顶的两个元素。优先队列的语法是这样的:

#include <queue>
#include <functional>
using namespace std;

//以下两个表达是等价的,都是数字越大的优先级大
priority_queue<int> q;
priority_queue<int, vector<int>, less<int> > q;

//表示数字越小的优先级越大
priority_queue<int, vector<int>, greater<int> > q;

其中第二种写法中的vector<int>填写的是来承载底层数据结构堆的容器,第三个参数less<int>表示数字大的优先级越大,而greater<int>表示数字小的优先级越大。

我个人对less<int>的理解是:想象每次从优先队列中取出优先级最高的数(数字最大的数),排列成一排,比如5 4 3 2 1,它是降序排列,所以是less

那么greater<int>就是相反的,每次从优先队列中取出优先级最高的数(数字最小的数),排列成一排,比如1 2 3 4 5,它是升序排列,所以是greater

如果数据是基本数据类型的话如int double char就可以像上面那样定义优先队列,如果不是基本数据类型而是结构体的话,可以像下面这样来定义(当然基本数据类型也可以这么用):

struct fruit{
    string name;
    int price;
    friend bool operator < (fruit f1, fruit f2){
        return f1.price < f2.price;
    }
};

priority_queue<fruit> q;

可以看到,结构体fruit中增加了一个友元函数,这个函数用来重载操作符“<”,要注意不能重载“>”,因为数学上来说只需要重载小于号也可以得到相同效果&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值