splay tree.java_伸展树与半伸展树Java实现

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() {

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值