今天把哈夫曼树又实现了一遍。主要使用了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中增加了一个友元函数,这个函数用来重载操作符“<”,要注意不能重载“>”,因为数学上来说只需要重载小于号也可以得到相同效果&