题目链接:
哈夫曼树_牛客题霸_牛客网哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树。题目来自【牛客题霸】https://www.nowcoder.com/share/jump/437195121692781391110
描述
哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和的最小值。
输入描述:
输入有多组数据。 每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n<=1000)。
输出描述:
输出权值。
示例1
输入:
5
1 2 2 5 9
输出:
37
思路:
- 读取输入的叶节点个数
n
。 - 创建一个小顶堆优先队列
myQueue
,用于存储叶节点的权值,队列中的元素自动按照从小到大的顺序排列。 - 循环读取
n
个叶节点的权值,将其插入优先队列。 - 初始化变量
answer
为 0,用于存储最终的答案。 - 当队列中还有两个及以上的节点时,循环执行以下操作:
- 弹出队列中权值最小的节点
a
,并将其弹出队列。 - 弹出队列中权值次小的节点
b
,并将其弹出队列。 - 将节点
a
和节点b
的权值之和累加到answer
中。 - 将新的节点(权值为节点
a
和b
权值之和)插入队列。
- 弹出队列中权值最小的节点
- 循环结束后,输出最终的答案
answer
,即所有节点的值与权值的乘积之和的最小值。
源代码:
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int main() {
int n; // 叶节点个数
while (cin >> n) {
priority_queue<int, vector<int>, greater<int>> myQueue; // 创建一个小顶堆优先队列
for (int i = 0; i < n; i++) {
int temp;
cin >> temp;
myQueue.push(temp); // 将叶节点权值插入优先队列
}
int answer = 0; // 存储最终的答案
while (myQueue.size() > 1) { // 当队列中还有两个及以上的节点时
int a = myQueue.top(); // 弹出队列中权值最小的节点
myQueue.pop();
int b = myQueue.top(); // 弹出队列中权值次小的节点
myQueue.pop();
answer += (a + b); // 将两个节点的权值之和累加到答案中
myQueue.push(a + b); // 将新的节点(权值为原两节点之和)插入队列
}
cout << answer << endl; // 输出最终的答案
}
return 0;
}
提交结果: