「平衡树之」treap

「treap之 」 作用

1.插入数值x
2.删除数值x(如果有多个,只删除一个)
3.查询数值x的排名(如有多个相同的数,应输出最小的排名)
4.查询排名为x的数值
5. 求数值x的前驱(小于x最大的数)
6.求数值x的后继(大于x最小的数)


如何实现:

最基本操作」.set

山寨版set

#include<bits/stdc++.h>
using namespace std;
struct node{
   node * son[2];
   int r,v;//r : 优先级,v :键值
   //比较键值的函数
   int cmp(int x) const {if( x == v) return -1; return x < v ? 0 : 1;}
};
inline void rotate(node* &o,int d){node *k = o->ch[d^1];o->ch[d^a] = k->ch[d];k->ch[d] = o;o = k;}

void insert (node* &o, int x) {
   if(o == NULL) { o = new node(); o->ch[0] = o->ch[1] = NULL; o->v = x; o->r = rand();}
                                                        //插到叶子 没有左右儿子                      //随机优先级
   else {
     int d = o->cmp(x);
     //d不会等于 -1吗???? 
     insert(o->ch[d],x);if(o->ch[d]->r  > o->r) rotate(o,d^1);
     }
 }

void remove (node* &o,int x){
    int d = o->cmp(x);
    //键值相等就比较优先级
    //优先级是个堆,任意根节点大于子节点
    if(d = -1){
     //哪个儿子为空插哪个    
      if(o->ch[0] == NULL) o = o->ch[1];
      else if(0->ch[1] == NULL)o = o->ch[0];
      else {//不空就把大的儿子放到根
         int d2 = (o->ch[0] -> r  >  o->ch[1] ->r ? 1 : 0);
         retate(o,d2); remove (o->ch[d2],x); 
    }
    }else remove(o->ch[d],x);
  }

  //判断插入或删除值是否存在。
 int find (node* o,int x){
     while(o != NULL) {
       int d = o->cmp(x);
       if(d == -1) return  1;
       else o = o->ch[d];//一直往下找儿子。
       }
       return 0;
 }

treap之」独特

rank tree

作用 ##:

  • 找出第k小,
  • x的排名

实现

猜你喜欢

转载自blog.csdn.net/k42946/article/details/81260820
今日推荐