Treap树

来源:互联网 发布:剑三商城捏脸数据导入 编辑:程序博客网 时间:2024/05/23 00:02
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct Node{    Node *ch[2];    int v,r,s;    int cmp(int x) const {        if(x==v) return -1;        return x<v?0:1;    }    void maintain(){        s=1;        if(ch[0]!=NULL) s+=ch[0]->s;        if(ch[1]!=NULL) s+=ch[1]->s;    }};void rotate(Node* &o,int d)//旋转,d=0左旋,d=1右旋{    Node *k=o->ch[d^1];o->ch[d^1]=k->ch[d];k->ch[d]=o;    o->maintain();k->maintain();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);        if(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(o->ch[1]==NULL) o=o->ch[0];        else{            int d2=(o->ch[0]->r>o->ch[1]->r)?1:0;            rotate(o,d2);remove(o->ch[d2],x);        }    }    else remove(o->ch[d],x);}bool find(Node *o,int x){    while(o!=NULL)    {        int d=o->cmp(x);        if(d==-1) return true;        else o=o->ch[d];    }    return false;}

0 0
原创粉丝点击