1.优先队列priority_queue,底层是用堆实现的,队首元素一定是当前队列中优先级最高的那一个。优先级设置有两种方式,priorty_queue< int>q 或者 priority_queue<int,vector,less>,第二个参数是来承载底层数据结构堆的容器。less< int>表示数字大的优先级大,greater< int>表示数字小的优先级大。
2.哈夫曼树合并结点时每次选取权重最小的两个结点进行合并。将结点保存到优先队列中,降序排列,每次取出队列中前两个权重值低的结点。合并结点后再压入队列中。
3.优先队列中将结构体指针作为参数,priority_queue<huffNode*,vector<huffNode*>,cmp>q; (非基本数据类型元素可以这样定义priority_queue<node,vecto< node>,cmp>q,其中cmp为比较函数,优先队列的cmp函数与sort中的cmp函数的效果是相反的。)
#include<bits/stdc++.h>
using namespace std;
struct huffNode{
int weight;
huffNode*left,*right;
huffNode(){left=right=NULL;}
};
struct cmp{ //降序排序,权重小的在前面,优先队列的cmp函数与sort中的cmp函数的效果是相反的。
bool operator()(huffNode*f1,huffNode *f2){
return f1->weight>f2->weight;
}
};
void preOrder(huffNode *root){
if(root){//后序遍历
printf("%d ",root->weight);
preOrder(root->left);
preOrder(root->right);
}
}
priority_queue<huffNode*,vector<huffNode*>,cmp>q;
int main()
{
int n;
scanf("%d",&n);
huffNode *tmp;
for(int i=0;i<n;i++){
tmp=new huffNode;
cin>>tmp->weight;
q.push(tmp);
}
while(q.size()>1){
huffNode *t1=q.top();
q.pop();
huffNode *t2=q.top();
q.pop();
huffNode *root=new huffNode;
root->weight=t1->weight+t2->weight;
root->left=t1;
root->right=t2;
q.push(root);
}
huffNode *root=q.top();
preOrder(root);
return 0;
}