优先队列
STL中的一种数据结构,原型为
优先队列有三个模板参数
第一个是入队的元素的数据类型
第二个为容器类型,默认容器是vector
第三个是比较方式,默认为less
简洁来说:优先队列其实就是在构建一个大根堆,遍历输入时为层序遍历输入
(如果此处理解困难,请先学习c++数据结构)
如果要改变建堆方式,改为小根堆,只需将比较函数改为greater,如果需要实现复杂的比较,还是建议重载<运算符。
ZOJ1167-Trees on the Level
问题描述
编写程序:
给出一组二叉树,实现按层遍历每棵树。本题中二叉树的每个结点都是一个正整数,并且所有的二叉树都不超过256个结点。
按层遍历一棵树时,同一层上所有结点的数据从左到右输出,第k层的结点应该在第k+1层的结点之前输出。
输入输出样例
输入样例
(11,LL)
(7,LLL)
(8,R)
(5,)
(4,L)
(13,RL)
(2,LLR)
(1,RRR)
(4,RR)
输出样例
5 4 8 11 13 4 7 2 1
上述构建树
问题分析
由题我们可以看出,这个树完全不是根据任何数字排序规则来建的,我们继续观察发现输入节点的第二个参数指定了该节点的位置,那么我们分析一下他们的排序规则,争取使用优先队列解决此问题。
经过分析我们可以定义一些规则,
''的优先级大于其他优先级,也就是代表根;
字符个数由小到大优先级递减,即L>LR>LLL;
相同字符个数时L的优先级大于R的优先级;
这样我们就可以重载<运算符使这些节点建成一个根据节点的第二个参数建成一个优先队列了!
代码
#include <iostream>
#include <string>
#include <queue>
using namespace std;
//定义节点
template<class T>
class Node{
T value;
string path;
public:
void set(T v,string p){value = v;path = p;}
T get_v(){return value;}
//重载的运算符
bool operator < (Node node) const {
if(path.length() > node.path.length()){
return true;
}else if(path.length() == node.path.length()){
return path > node.path;
}else{
return false;
}
}
};
int main()
{
string node,value,path;
Node<string> n;
priority_queue< Node<string> > q;
int index1,index2;
while(cout<<"请输入节点:"&&cin >> node){
index1 = node.find_first_of(',');
value = node.substr(1,index1-1);
index2 = node.find_first_of(')');
path = node.substr(index1+1,index2-index1-1);
n.set(value,path);
q.push(n);
}
while(!q.empty()){
n = q.top();
q.pop();
cout<<n.get_v()<<" ";
}
cout << endl;
return 0;
}