aliao@eagle.wesleyan.edu (09/27/90)
The following is my version of the splay tree implementation if
anyone is interested. It is based on the description provided in
the 1985 JACM paper by Bob Tarjan And Dan Sleator.
The splay routines are called in the following manner:
root=splay(arg,root); /* Search */
root=splayinsert(arg,root); /* Insert */
root=splaydelete(arg,root); /* Delete */
/* Splay tree implementation
Translated from the initial Pascal version by Andrew M. Liao
*/
struct node { char *data; struct node *left,*right; };
struct nrec { struct node *left,*right; };
#define false 0
#define true 1
struct node *rrot(root)
struct node *root;
{ struct node *temp,*temp1,*p;
p=root;
if (p!=NULL)
{ if (p->left!=NULL)
{ temp=p; temp1=p->left->right;
p=temp->left; p->right=temp; temp->left=temp1;
}
}
return(p);
}
struct node *lrot(root)
struct node *root;
{ struct node *temp,*temp1,*p;
p=root;
if (p!=NULL)
{ if (p->right!=NULL)
{ temp=p; temp1=p->right->left;
p=temp->right; p->left=temp; temp->right=temp1;
}
}
return(p);
}
struct node *lnkright(root,r)
struct node *root;
struct nrec *r;
{ struct node *temp,*p;
p=root;
if (p->left!=NULL)
{ temp=p->left; p->left=NULL;
if (r->left==NULL)
{ r->left=p; r->right=p; }
else
{ r->right->left=p; r->right=r->right->left; }
p=temp;
}
return(p);
}
struct node *lnkleft(root,l)
struct node *root;
struct nrec *l;
{ struct node *temp,*p;
p=root;
if (p->right!=NULL)
{ temp=p->right; p->right=NULL;
if (l->left==NULL)
{ l->left=p; l->right=p; }
else
{ l->right->right=p; l->right=l->right->right; }
p=temp;
}
return(p);
}
struct node *assemble(p,l,r)
struct node *p;
struct nrec *l,*r;
{ struct node *temp,*temp1;
temp=p->left; temp1=p->right;
if (l->left!=NULL)
{ p->left=l->left; l->right->right=temp; }
if (r->left!=NULL)
{ p->right=r->left; r->right->left=temp1;}
}
struct node *splay(x,root)
key x;
struct node *root;
{ struct nrec l,r; /* Temp subtrees */
struct node *p;
int done; /* Process boolean */
p=root;
l.left=l.right=r.left=r.right=NULL;
done=false;
if (p!=NULL)
{ do
{if (x<p->data)
{ if (p->left!=NULL)
{ if (x==p->left->data) p=lnkright(p,&r);
else
if (x<p->left->data) { p=rrot(p); p=lnkright(p,&r); }
else
if (x>p->left->data)
{ p=lnkright(p,&r); p=lnkleft(p,&l); }
} else done=true;
}
else
if (x>p->data)
{ if (p->right!=NULL)
{ if (x==p->right->data) p=lnkleft(p,&l);
else
if (x>p->right->data) { p=lrot(p); p=lnkleft(p,&l); }
else
if (x<p->right->data)
{ p=lnkleft(p,&l); p=lnkright(p,&r); }
} else done=true;
}
}
while ((p->data!=x) && !done);
assemble(p,&l,&r);
}
return(p);
}
struct node *splayinsert(x,root)
key x;
struct node *root;
{ struct node *p;
struct node foo;
root=splay(x,root);
if ((root==NULL) || (root->data!=x))
{ p=(struct node *) malloc(sizeof(foo));
p->data=x; p->left=p->right=NULL;
if ((root!=NULL) && (x<root->data))
{ p->right=root; p->left=root->left;
root->left=NULL;
}
else
if ((root!=NULL) && (x>root->data))
{ p->left=root; p->right=root->right;
root->right=NULL;
}
root=p;
}
return(root);
}
/* NOTE: SPLAYDELETE is currently set up to deal with integer keys.
if you want to deal with strings, you will have to build an
appropriate character array all of whose bytes have the maximum
ASCII value on you machine. */
struct node *splaydelete(x,root)
key x;
struct node *root;
{ struct node *temp1,*temp2;
key max=2147483647;
root=splay(x,root);
if ((root!=NULL) && (root->data==x))
{ temp1=root->left; temp2=root->right;
if (temp1!=NULL)
{ temp1=splay(max,temp1);
temp1->right=temp2;
} else temp1=temp2;
free((char *) root);
root=temp1;
}
return(root);
}kingsley@hpwrce.HP.COM (Kingsley Morse) (09/28/90)
Does anyone know how much cpu is needed to build a splay tree, and how much
cpu is needed to search a splay tree? For example, assume the splay tree
has P patterns (or "records"), each pattern has D dimensions (or "keys"),
and each record belongs to one of C classes (or "bins). Then the computational
complexity of building a tree MAY be something like:
cpu(build) = (PlnP)*(x**C)*D
and the computational complexity of searching a tree MIGHT be
cpu(search) = (lnP)*(x**C)
I've used "x" to denote a data dependent constant.
If you're interested in this line of thought, you may want to participate in
the "Classification Clearinghouse" posting in sci.math.stat.
Kingsley