哈夫曼树其实可以视为大顶堆(从大到小的二叉树),从叶到根,分别取优先队列中最小的俩个数进行和值,构成小型二叉树不断循环往上。
#include <bits/stdc++.h>
using namespace std;
string s;
int num[30];
int bfs()
{
int a, b, sum = 0;
priority_queue<int, vector<int>, greater<int>> q;//从小到大
for (int i = 0; i < 27; i++)
{
if (num[i])
q.push(num[i]);
}
if (q.size() == 1)
sum = q.top();
while (q.size() > 1)
{
a = q.top();
q.pop();
b = q.top();
q.pop();
sum += a + b;
q.push(a + b);
}
return sum;
}
int main()
{
while (cin >> s)
{
if (s == "END")
break;
memset(num, 0, sizeof num);
int len = s.size();
for (int i = 0; i < len; i++)
{
if (s[i] == '_')
num[26]++;
else
num[s[i] - 'A']++;
}
int res = bfs();
cout << len * 8 << ' ' << res << ' ' << len * 8 * 1.0 / res << '\n';
}
return 0;
}