Luogu P5076 普通二叉树(利用vector实现二叉树的一些操作,vector不比set难用)

这篇博客探讨了如何利用二叉搜索树(BST)来实现一个在线排名系统,支持查询排名、查找特定排名的数值、获取数值的前驱和后继以及插入和删除操作。博主指出,虽然BST在某些操作上效率较高,如查询和前驱后继,但插入和删除操作在最坏情况下可能达到O(n)的时间复杂度。此外,还提到了使用set、数组和树状数组/线段树的组合可能提供更好的解决方案。
摘要由CSDN通过智能技术生成

链接1:https://www.luogu.com.cn/problem/P5076

链接2:https://www.luogu.com.cn/problem/P3369

综合题意:给定n个操作(n<=1e5)。

1.查询x的排名

2.查询排名为x的数

3.求x的前驱(若无则输出-2147483647)

4.求x的后继(若无则输出2147483647)

5.插入x

6.删除x

所有数都在1e9以内。

题解:无疑是考察二叉树的模板问题,我们这里用vector来操作(之后也可以这样子用),下标从0开始

总结:1.vector更是严格的“二叉树”,不会“退化”,复杂度一般稳定在O(logn)。唯一的缺点就是插入的时候时间复杂度最坏是O(n)的。

2.二叉树这些操作比这个麻烦太多了,明天有时间的话再来研究下完全用二叉排序树来实现吧。

3.可能最强的是set+数组+树状数组/线段树吧

代码:

struct two {
	vector<ll> v;
	vector<ll>::iterator p;
	//1.返回 x的排名,时间复杂度为O(logn)
	ll queryrnk(ll x) {
		return lower_bound(v.begin(),v.end(),x)-v.begin()+1;
	}
	//2.返回排名为x的数,时间复杂度为O(1)
	ll querykth(ll x) {
		return v[x-1];
	}
	//3.返回x的前驱,若没找到则输出-inf,时间复杂度为O(logn)
	//注意前驱后继为二叉树上的,而非数组上的,差别在于,二叉树上无重复
	ll get_pre(ll x) {
		p=lower_bound(v.begin(),v.end(),x);//先找x
		if(p==v.begin()) return -inf;//最差为v.begin()
		else return *(p-1);
	}
	//4.返回x的后缀,若没找到则输出inf,时间复杂度为O(logn)
	ll get_nxt(ll x) {
		p=upper_bound(v.begin(),v.end(),x);
		if(p==v.end()) return inf;
		else return *p;//注意不是*(p+1)
	}
	//5.插入x,时间复杂度为线性,最坏O(n)
	void insert(ll x) {
		v.insert(upper_bound(v.begin(),v.end(),x),x);//从后往前移,upper更好 
//v.insert::在某个迭代器的位置插入某个元素,时间复杂度与插入位置后面的数的个数有关
	}
    //6.删除x,时间复杂度与insert一样
	void erase(ll x){
		v.erase(lower_bound(v.begin(),v.end(),x));//删除某迭代器位置的数,复杂度与insert一样 
	}
}T;

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值