treap模板

treap的本质实际上就是tree+heap
用树的形式实现类似于堆得操作
中心代码就是 左旋 右旋
其中的原则就是堆顶最大

(可以用并查集+树链刨分,不过好像有点大材小用了

```cpp
#include<bits/stdc++.h>
using namespace std;
struct node{
	int key,priority;
	int left,right;
};
int SIZE=1e5;
int num_nodes,root;
node nodes[SIZE];
int rightRotate(int node_id){
	//记录当前左节点
	int ret=nodes[node_id].left;
	//将当前节点的左节点变为左节点的右节点
	nodes[node_id].left=nodes[ret].right;
	//将左节点的右节点改为当前节点
	nodes[ret].right=node_id;
	return ret; 
}
int leftRotate(int node_id){
	int ret=nodes[node_id].right;
	nodes[node_id].right=nodes[ret].left;
	nodes[ret].left=node_id;
	return ret;
}
int insert(int node_id,int key,int priority){
	if(node_id==-1){
		nodes[num_nodes].key=key;
		nodes[num_nodes].priority=priority;
		nodes[num_nodes].left=-1;
		nodes[num_nodes].right=-1;
		num_nodes++;
		return num_nodes-1;
	}
	//相等忽略
	if(nodes[node_id].key==key){
		
		return node_id;
	} 
	if(nodes[node_id].key>key){
		nodes[node_id].left=insert(nodes[node_id].left,key,priority);
		//小于则右旋
		if(nodes[node_id].priority<nodes[nodes[node_id].left].priority){
			node_id=rightRotate(node_id);
		} 
		
	}else{
		nodes[node_id].right=insert(nodes[node_id].right.key.priority);
		//小于则左旋
		if(nodes[node_id].priority<nodes[nodes[node_id].right].priority){
			node_id=leftRotate(node_id);
		} 
	}
	return node_id;
}
int del(int node_id,key){
	//根或叶子删除
	if(num_nodes==0||node_id==-1){
		return -1;
	} 
	//小于当前向左进行
	if(nodes[node_id].key>key){
		nodes[node_id].left=del(nodes[node_id].left,key);
	}else
	if(nodes[node_id].key<key){
		nodes[node_id].right=del(nodes[node_id].right,key);
	}else{
		return del_2(node_id,key);
	}
} 
int del_2(int node_id,int key){
	//叶子删除 
	if(nodes[node_id].left==-1&&nodes[node_id].right==-1){
		return -1;
	}else if(ndoes[node_id].left==-1){
		node_id=leftRotate(node_id);
		//左子树空,左旋 
	}else if(nodes[node_id].right==-1){
		node_id=rightRotate(node_id);
		//右子树空,右旋 
	}else{
		if(nodes[nodes[node_id].left].priority>nodes[nodes[node_id].right].priority){
			node_id=rightRtotate(node_id);
		}else{
			node_id=leftRotate(node_id);
		}
		//左右非空,比较优先级 
	}
	return del(node_id,key)
}
int main(){
	
	return 0;
} 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值