packagealgorithms.tree;/***@authoryovn
**/publicclassSplayTree>extendsDefaultBSTreeimplementsBSTree{staticclassSplayTreeNode>extendsBSTNode{
SplayTreeNodeparent;
SplayTreeNode(SplayTreeNodeparent,E key) {super(key);this.parent=parent;
}
}
@Overridepublicbooleandelete(E ele) {return_delete((SplayTreeNode)root,ele);
}privateboolean_delete(SplayTreeNodepointer, E ele) {intcmp=ele.compareTo(pointer.key);while(cmp!=0)
{if(cmp<0)
{
pointer=(SplayTreeNode)pointer.left;
}else{
pointer=(SplayTreeNode)pointer.right;
}if(pointer==null)returnfalse;
cmp=ele.compareTo(pointer.key);
}//okay find itSplayTreeNodep=pointer.parent;if(pointer.left==null)
{if(p!=null)
{
keep_right(pointer);
splay(p);
}else{
root=p.right;if(root!=null)((SplayTreeNode)root).parent=null;
}
}elseif(pointer.right==null)
{if(p!=null)
{
keep_left(pointer);
splay(p);
}else{
root=p.left;if(root!=null)((SplayTreeNode)root).parent=null;
}
}else{
SplayTreeNodetodo=(SplayTreeNode)pointer.left;
SplayTreeNodetodoP=null;while(todo.right!=null)
{
todoP=todo;
todo=(SplayTreeNode)todo.right;
}
pointer.key=todo.key;if(todoP!=null) {
todoP.right=todo.left;if(todo.left!=null)
((SplayTreeNode) todo.left).parent=todoP;
}else{
pointer.left=null;
}
splay(pointer.parent);
}returntrue;
}privatevoidkeep_left(SplayTreeNodepointer) {
SplayTreeNodep=pointer.parent;if(p.left==pointer)
{
p.left=pointer.left;if(p.left!=null)((SplayTreeNode)p.left).parent=p;
}elseif(p.right==pointer)
{
p.right=pointer.left;if(p.right!=null)((SplayTreeNode)p.right).parent=p;
}
}privatevoidkeep_right(SplayTreeNodepointer) {
SplayTreeNodep=pointer.parent;if(p.left==pointer)
{
p.left=pointer.right;if(p.left!=null)((SplayTreeNode)p.left).parent=p;
}elseif(p.right==pointer)
{
p.right=pointer.right;if(p.right!=null)((SplayTreeNode)p.right).parent=p;
}
}protectedvoidsplay(SplayTreeNodecur) {if(cur==null)return;while(cur!=root)
{if(cur.parent==root)
{//single RotationSingleRotation(cur,cur.parent);
cur.parent=null;
root=cur;
}elseif(cur.parent.left==cur&&cur.parent.parent.left==cur.parent)
{
cur=Left_ZigZig(cur,cur.parent,cur.parent.parent);
}elseif(cur.parent.right==cur&&cur.parent.parent.right==cur.parent)
{
cur=Right_ZigZig(cur,cur.parent,cur.parent.parent);
}elseif(cur.parent.left==cur&&cur.parent.parent.right==cur.parent)
{
cur=RL_ZigZag(cur,cur.parent,cur.parent.parent);
}elseif(cur.parent.right==cur&&cur.parent.parent.left==cur.parent)
{
cur=LR_ZigZag(cur,cur.parent,cur.parent.parent);
}else{
System.out.println("Oooops!!!");
}
}
}privateSplayTreeNodeLR_ZigZag(SplayTreeNodecur,
SplayTreeNodep, SplayTreeNodeg) {
SplayTreeNodegp=g.parent;
g.left=cur.right;
setParent(cur.right,g);
g.parent=cur;
cur.right=g;
p.right=cur.left;
setParent(cur.left,p);
p.parent=cur;
cur.left=p;if(gp!=null)
{if(gp.left==g)
{
gp.left=cur;
}else{
gp.right=cur;
}
}elseroot=cur;
cur.parent=gp;returncur;
}privateSplayTreeNodeRL_ZigZag(SplayTreeNodecur,
SplayTreeNodep, SplayTreeNodeg) {
SplayTreeNodegp=g.parent;
g.right=cur.left;
setParent(cur.left,g);
g.parent=cur;
cur.left=g;
p.left=cur.right;
setParent(cur.right,p);
p.parent=cur;
cur.right=p;if(gp!=null)
{if(gp.left==g)
{
gp.left=cur;
}else{
gp.right=cur;
}
}elseroot=cur;
cur.parent=gp;returncur;
}protectedSplayTreeNodeRight_ZigZig(SplayTreeNodecur, SplayTreeNodep,
SplayTreeNodeg) {
SplayTreeNodegp=g.parent;
g.right=p.left;
setParent(p.left,g);
p.right=cur.left;
setParent(cur.left,p);
g.parent=p;
p.left=g;
p.parent=cur;
cur.left=p;if(gp!=null)
{if(gp.left==g)
{
gp.left=cur;
}else{
gp.right=cur;
}
}elseroot=cur;
cur.parent=gp;returncur;
}protectedSplayTreeNodeLeft_ZigZig(SplayTreeNodecur, SplayTreeNodep,
SplayTreeNodeg) {
SplayTreeNodegp=g.parent;
g.left=p.right;
setParent(p.right,g);
g.parent=p;
p.right=g;
p.left=cur.right;
setParent(cur.right,p);
p.parent=cur;
cur.right=p;if(gp!=null)
{if(gp.left==g)
{
gp.left=cur;
}else{
gp.right=cur;
}
}elseroot=cur;
cur.parent=gp;returncur;
}finalvoidsetParent(BSTNodec, BSTNodep) {if(c!=null)((SplayTreeNode)c).parent=(SplayTreeNode)p;
}privatevoidSingleRotation(SplayTreeNodecur, SplayTreeNodep) {if(p.left==cur)
{
p.left=cur.right;if(cur.right!=null)((SplayTreeNode)cur.right).parent=p;
cur.right=p;
p.parent=cur;
}elseif(p.right==cur)
{
p.right=cur.left;if(cur.left!=null)((SplayTreeNode)cur.left).parent=p;
cur.left=p;
p.parent=cur;
}
}
@Overridepublicvoidinsert(E ele) {if(root==null) {
root=newSplayTreeNode(null,ele);return;
}
_insert((SplayTreeNode)root,ele);
}privatefinalvoid_insert(SplayTreeNodepointer,E ele)
{intcmp=pointer.key.compareTo(ele);if(cmp==0)
{thrownewIllegalArgumentException();
}if(cmp>0)
{if(pointer.left==null)
{
pointer.left=newSplayTreeNode(pointer,ele);
splay((SplayTreeNode)pointer.left);return;
}
_insert((SplayTreeNode)pointer.left,ele);
}else{if(pointer.right==null)
{
pointer.right=newSplayTreeNode(pointer,ele);
splay((SplayTreeNode)pointer.right);return;
}
_insert((SplayTreeNode)pointer.right,ele);
}
}
@Overridepublicbooleansearch(E ele) {return_search((SplayTreeNode)root,ele);
}privateboolean_search(SplayTreeNodepointer, E ele) {if(pointer==null)returnfalse;intcmp=pointer.key.compareTo(ele);if(cmp==0)
{
splay(pointer);returntrue;
}if(cmp>0)
{return_search((SplayTreeNode)pointer.left,ele);
}else{return_search((SplayTreeNode)pointer.right,ele);
}
}/****/publicSplayTree() {
}
}