P5076 【深基16.例7】普通二叉树(简化版)

问题描述

在这里插入图片描述

思路

本题就是multiset(二叉线索平衡树)的应用
主要应用两个函数 :lower_bound,upper_bound
看完了有关set 和multiset的CSDN,这题就绝对没问题

  1. 查询 x 数的排名
    排名,说白了就是排序之后的x的下标。

我们只要用lower_bound方法,找到第一个x的位置。

然后从begin开始往后遍历容器,只要达到这个位置,就输出当前下标即可。

2.查询排名为 x 的数
遍历容器,只要当前排名到达x,就输出当前值。

(因为multiset容器无法进行随机访问)

3.求 x 的前驱(前驱定义为小于 x,且最大的数)
前驱,也就是x的前一个。

我们只要用lower_bound方法找到第一个x的位置,然后输出上一个就OK了。

4.求 x 的后继(后继定义为大于 x,且最小的数)。
后继,也就是第一个大于x的数。

我们可以用upper_bound方法,直接找到这个值。

5.插入一个数 x
直接用insert方法插入即可。

代码

#include <iostream>
#include <set>
using namespace std;

int main()
{
    int n,op,x,num;
    cin>>n;
    multiset <int> a;
    a.insert(-2147483647);//按题目要求,先插入两个数据,在找前驱和后继的时候找不到就会返回这两个值
    a.insert(2147483647);
    multiset <int> ::iterator it;
    for(int i=0;i<n;i++) {
        cin>>op>>x;
        if(op==1) {
            num=0;
            it=a.lower_bound(x);
            for(multiset<int>::iterator j=a.begin();j!=a.end();j++) {
                if(j!=it) num++;
                else break;
            }
            cout<<num<<endl;
        }
        else if(op==2) {
            num=-1;
            for(multiset <int>::iterator j=a.begin();j!=a.end();j++) {
                num++;
                if(num==x) {
                    cout<<*j<<endl;
                    break;
                }
            }
        }
        else if(op==3) {
            it=a.lower_bound(x);
            cout<<*(--it)<<endl;
        }
        else if(op==4) {
            cout<<*(a.upper_bound(x))<<endl;
        }
        else a.insert(x);
    }
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值