哈夫曼树其实可以视为大顶堆(从大到小的二叉树),从叶到根,分别取优先队列中最小的俩个数进行和值,构成小型二叉树不断循环往上。
#includeusing namespace std; string s; int num[30]; int bfs() { int a, b, sum = 0; priority_queue , greater > 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; }



