算法设计与分析之优先队列及解决ZOJ1167

优先队列

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;
}

本博客其他文章推荐

算法设计与分析之数字三角形问题

算法设计与分析之ZOJ2104- Let the Balloon Rise

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值