哈夫曼树是一种二叉树,但是它是一种加权路径长度最短的二叉树。
其可用堆来实现它的构建
其构建方法如下:
//heap.h
//仿函数
template<class T>
struct Less
{
bool operator()(const T& left, const T& right)const
{
return left < right;
}
};
template<class T>
struct Great
{
bool operator()(const T& left, const T& right)const
{
return left > right;
}
};
//给模板参数
template<class T,class Compare = Great<T>>
//先实现大堆 后面仿函数再实现小堆
class Heap
{
public:
//构造函数 无参+有参
//初始化空堆
Heap()
{}
//把数组调成堆
Heap(T* a,size_t n)
{
//开空间 不把size增容 且对于空间不初始化
_a.reserve(n);
for (size_t i = 0; i < n; ++i)
{
//把数组里的数字放在vector里
_a.push_back(a[i]);
}
//建堆 构建成一个大堆 从最后一个非叶结点的父亲开始
for (int i = (_a.size() - 2) / 2; i >= 0; --i)
{
//向下调整算法 调成大