以叶节点的权值为1,2,3,4,5,求解二叉哈夫曼树的问题。直接计算了结果没有构建出哈夫曼树。
计算的问题是:求最小的
∑
w
i
∗
l
i
\sum {w_i*l_i}
∑wi∗li,其中w为叶节点,L为叶节点到根的深度。
#include<iostream>
#include<queue>
using namespace std;
struct rec //定义了结构体,方便重载小于号
{
int v;
};
rec exm;
priority_queue<rec> q; //直接定义的是大根堆
bool operator <(const rec& a, const rec& b) //重载小于号,为了构建小根堆
{
return a.v > b.v;
}
int main()
{
int arr[5] = { 1,2,3,4,5 };
for (int i = 1; i <= 5; i++) //把所有叶节点插入小根堆,因为正好是i所以直接赋值了
{
exm.v = i;
q.push(exm);
}
rec w1, w2;
int ans = 0;
while (q.size()>1)
{
/*
每次取出最小的两个权值w1和w2,计算ans+=w1+w2
将w1+w2作为新的权值插入堆,其就是w1和w2在哈夫曼树中的父节点。
重复直到堆的大小为一
最后ans就是问题的答案
*/
w1 = q.top();
q.pop();
w2 = q.top();
q.pop();
exm.v = w1.v + w2.v;
ans += exm.v;
q.push(exm);
}
cout << ans;
}