题解 | 哈夫曼树 优先队列(大根堆)

哈夫曼树

https://www.nowcoder.com/practice/162753046d5f47c7aac01a5b2fcda155

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <queue>  // 小根堆 头文件
using namespace std;

int main(){
	// 默认大根堆
	priority_queue<int> pqueue;  // 存储权值的相反数(使用再相反数)得到小根堆
	int n;
	scanf("%d", &n);
	for(int i=0;i<n;i++){
		int leaf;
		scanf("%d",&leaf);
		// pqueue.push(-leaf);
		pqueue.push(-1*leaf);  // 存储权值相反数
	}

	int wpl = 0;
	// 2个结点以上才合并结点求wpl
	while (pqueue.size() >= 2) {
		int leaf1 = pqueue.top();
		pqueue.pop();
		int leaf2 = pqueue.top();
		pqueue.pop();
		wpl += leaf1 + leaf2;  // 最后统一取相反
		pqueue.push(leaf1 + leaf2);  // 合并结点重新压回队列
	} 

	printf("%d\n",-1*wpl);  // 取反即为wpl

	return 0;
}

2025考研复试 文章被收录于专栏

复试ing,努力中。。。

全部评论

相关推荐

练习JAVA时长两年半:qps 30000
点赞 评论 收藏
分享
04-06 16:59
已编辑
河南工业大学 Java
牛牛牛的牛子:最好扔了,实在没有选择的选择
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务