以下为伸展树的splaying操作代码(未含建树、插入、删除)
#include<stdio.h>
typedef struct node {
struct node *parent,*lchild,*rchild;
int val;
}tree;
typedef tree* Tree;
void zig(Tree &root, Tree node)//逆时针单步旋转
{
if (node == NULL) return;
/*记录下node的父亲和祖父结点*/
Tree parent = node->parent; //父结点
Tree grandparent = parent->parent; //祖父结点
/*更新node结点的父节点信息*/
parent->rchild = node->lchild;
if (node->lchild) node->lchild->parent = parent;//如果有左孩子则更新左孩子的父亲结点
/*更新node结点自身的信息*/
node->lchild = parent;
parent->parent = node;
node->parent = grandparent;
/*更新grandparent的信息*/
if (grandparent)
{
if (grandparent->lchild == parent) grandparent->lchild = node;
else grandparent->rchild = node;
}
else root = node;//不存在grandparent说明node已经旋转到根结点
return;
}
void zag(Tree &root, Tree node)//顺时针单步旋转
{
if (node == NULL) return;
Tree parent = node->parent;
Tree grandparent = parent->parent;
parent->lchild = node->rchild;
if (node->rchild) node->rchild->parent = parent;
node->rchild = parent;
parent->parent = node;
node->parent = grandparent;
if (grandparent)
{
if (grandparent->lchild == parent) grandparent->lchild = node;
else grandparent->rchild = node;
}
else root = node;
return;
}
void zig_zig(Tree &root, Tree node)
{
zig(root, node->parent);
zig(root, node);
}
void zag_zag(Tree &root, Tree node)
{
zag(root, node->parent);
zag(root, node);
}
void zig_zag(Tree &root, Tree node)
{
zig(root, node);
zag(root, node);
}
void zag_zig(Tree &root, Tree node)
{
zag(root, node);
zig(root, node);
}
void splaying(Tree& x, Tree node)//把node伸展到x处
{
if (x == node) return;
if (x->lchild == node) zag(x, node);
else if(x->rchild == node) zig(x, node);
else
{
if (node->val >= x->val)
{
if (node->val >= x->rchild->val)
{
splaying(x->rchild->rchild, node);
zig_zig(x, x->rchild->rchild);
}
else
{
splaying(x->rchild->lchild, node);
zag_zig(x, x->rchild->lchild);
}
}
else
{
if (node->val >= x->lchild->val)
{
splaying(x->lchild->rchild, node);
zig_zag(x, x->lchild->rchild);
}
else
{
splaying(x->lchild->lchild, node);
zag_zag(x, x->lchild->lchild);
}
}
}
}