treap(tree+heap)平衡树;
结点定义如下:
struct Node{ Node *ch[2];//左右子树 int r,v;//优先级&值 int cmp(int x)const{if(x==v)return -1;return x>v;} };
解释一下,treap同时拥有值与优先级,即同时满足heap与BST性质,优先级是一个rand值
接下来就是旋转,旋转代码如下:
//d=0表示左旋,=1表示右旋 void rotate(Node *o,int d){ Node *k=o->ch[d^1];o->ch[d^1]=k->ch[d],k->ch[d]=o,o=k; }
旋转是很简单的=_-,如果不清楚旋转方法,就找一张图对着代码手动模拟一下吧:)
treap支持插入,删除;
插入代码如下:
void insert(Node *&o,int x){ if(o==null){ o=new Node(); o->ch[0]=o->ch[0]=null; o->v=x,o->r=rand(); }else{ int d=o->cmp(x); insert(o->ch[d],x); if(o->ch[d]->r>o->r)rotate(o,d^1); } }
删除代码如下:
void del(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),del(o->ch[d2],x); } }else del(o->ch[d],x); }
loading...