构造一棵哈夫曼树并计算最短路径长度
#include <iostream>
#include <queue>
#include <string>
#include <vector>
using namespace std;
//构造一棵哈夫曼树,
//并求其带权路径长度
void HafumanTree(){
//构建封装小根堆的优先级队列
priority_queue<int,vector<int>,greater<int>> myPriorityQueue;
//构建封装大根堆的优先级队列
priority_queue<int> hafuman;
//添加哈夫曼树的叶子节点
int n;
scanf("%d",&n);
for(int i = 0;i < n;i++){
int x;
scanf("%d",&x);
myPriorityQueue.push(x);
hafuman.push(x);
}
//遍历优先级队列,并求得其最短路径长度
int paths = 0;
while(myPriorityQueue.size() > 1){
int x = myPriorityQueue.top();
myPriorityQueue.pop();
int y = myPriorityQueue.top();
myPriorityQueue.pop();
paths += x+y;
myPriorityQueue.push(x+y);
hafuman.push(x+y);
}
//遍历哈夫曼树
while(!hafuman.empty()){
printf("%d ",hafuman.top());
hafuman.pop();
}
printf("\n");
printf("%d\n",paths);
}
int main()
{
HafumanTree();
}