//node为节点类型,其中ch[0]表示左结点指针,ch[1]表示右节点指针
//pre表示指向父亲的指针
void Rotate(node *x,int c) //旋转操作,c=0表示左旋,c=1表示右旋
{
node *y= x->pre;
Push_Down(y), Push_Down(x);
//先将Y节点的标记乡下传递(因为Y在上面),再把X的标记向下传递
y->ch[!c]=x->ch[c];
if (x->ch[c] != NULL) x->ch[c]->pre = y;
x->pre =y->pre;
if (y->pre !=NULL)
if (y->pre->ch[0] == y) y->pre->ch[0]=x;
else y->pre->ch[1]=x;
x->ch[c]=y;
y->pre=x;
Update(y);//维护Y节点
if (y==root) root = x;//root表示整棵树的根节点
}
void Splay(node *x,int *f)//Splay操作,表示把节点x转到节点f的下面
{
for (Push_Down(x);x->pre!=f ; )//一开始就将x的标记下传
if (x->pre->pre==f) //父节点的父亲即为f,执行单旋转
if (x->pre->ch[0]==x) Rotate(x,1);
else Rotate(x,0);
else {
node *y=x->pre,*z=y->pre;
if (z->ch[0]==y)
if (y->ch[0]==x)
Rotate(y,1),Rotate(x,1);//一字型旋转
else
Rotate(x,0),Rotate(x,1);//之字形旋转
else
if (y->ch[1]==x)
Rotate(y,0),Rotate(x,0);//一字型旋转
else
Rotate(x,1),Rotate(x,0);//之字形旋转
}
Update(x);//最后再维护x节点
}
Splay树的基本写法
最新推荐文章于 2018-08-14 18:19:41 发布