PBSTNode splayR(PBSTNode h,Item item)
{
if (h == z)
{
return NEW(item, z, z, 1);
}
PBSTNode p = NULL;
int flag = 0;
Key v = key(item);
while (h != z)
{
if (v < key(h->data))
{
if (h->left == z)
{
return NEW(item, z, h, h->N+1);
}
if (v < h->left->data)
{
p = h;
h = h->left->left;
if (h == z)
{
p->left->left = NEW(item, z, z, 1);
flag = 1;
}
else if((v > key(h->data))&&(h->right == z))
{
p->left->left = NEW(item, h, z, h->N+1);
flag = 1;
}
else if((v < key(h->data))&&(h->left == z))
{
p->left->left = NEW(item, z, h, h->N+1);
flag = 1;
}
p = rotR(p);
}
else
{
p = h;
h = h->left->right;
if (h == z)
{
p->left->right = NEW(item, z, z, 1);
flag = 1;
}
else if((v < key(h->data))&&(h->left == z))
{
p->left->right = NEW(item, z, h, h->N+1);
flag = 1;
}
else if((v > key(h->data))&&(h->right == z))
{
p->left->right = NEW(item, h, z, h->N+1);
flag = 1;
}
p->left = rotL(p->left);
}
if (v > key(h->data))
{//调整
p = rotL(p);
}
else
{
p = rotR(p);
}
}
else
{
if (h->right == z)
{
return NEW(item, h, z, h->N+1);
}
if (h->right->data < v)
{
p = h;
h = h->right->right;
if (h == z)
{
p->right->right = NEW(item, z, z, 1);
flag = 1;
}
else if((v < key(h->data))&&(h->left == z))
{
p->right->right = NEW(item, z, h, h->N+1);
flag = 1;
}
else if ((v > key(h->data))&&h->right == z)
{
p->right->right = NEW(item, h, z, h->N+1);
flag = 1;
}
p = rotL(p);
}
else
{
p = h;
h = h->right->left;
if (h == z)
{
p->right->left = NEW(item, z, z, 1);
flag = 1;
}
else if((v < key(h->data))&&(h->left == z))
{
p->right->left = NEW(item, z, h, h->N+1);
flag = 1;
}
else if ((v > key(h->data))&&(h->right == z))
{
p->right->left = NEW(item, h, z, h->N+1);
flag = 1;
}
p->right = rotR(p->right);
}
if (v < key(h->data))
{//调整
p = rotR(p);
}
else
{
p = rotL(p);
}
}
if (flag)
{
break;
}
}
return h = p;
}