LLRBTree

// RBTree
#define BLACK 0
#define RED 1
typedef int Int
Struct RBNode{
	RBNode *chi[2],*pa;
	int color,cnt;
}*nil=new RBNode(),*root=nil;
void Nil(){ CreatNode(nil,0,BLACK,0); }  
RBNode * CreatNode(RBNode * &node,Int val,int color,int cnt=1){  
    if(node!=NULL && node!=nil){ RBNode *p=node; delete p; }  
    node=new RBNode(); node->val=val; node->cnt=cnt;  
    node->pa=node->chi[0]=node->chi[1]=nil; return node;  
}  
void Connect(RBNode *pa,RBNode *node,int dir)  
    { Nil(); pa->chi[dir]=node; node->pa=pa; Nil(); }
RBNode * Extrema(RBNode * node,int dir){  
    while(node->chi[dir]!=nil) node=node->chi[dir];  
    return node;  
}  
RBNode * Cessor(RBNode * node,int dir){  
    if(node->chi[dir]!=nil) return Extrema(node->chi[dir],1-dir);  
    for(RBNode * p=node->pa;p!=nil && p->chi[dir]==node;node=p,p=p->pa);  
    return node->pa;  
} 
RBNode * Bound(RBNode * node,Int val,int dif=1){  
    if(node==nil) return nil;  
    for(int dir;val!=node->val;node=node->chi[dir]){  
        dir=(val<node->val)?0:1;  
        if(node->chi[dir]==nil) return node;  
    }  
    if(!dif && node->val!=val) return nil; 
    return node;  
}
void Rotate(RBNode *node,int rodir){  
    Nil(); RBNode *pivot=node->chi[1-rodir];  
    Connect(node,node->chi[1-rodir]->chi[rodir],1-rodir);  
    Connect(node->pa,pivot,(node->pa->chi[0]==node)?0:1);  
    Connect(pivot,node,rodir); Nil();  
    if(root==node) root=pivot;  
}  
void Fixup(RBNode *root,RBNode *node){
}
void Insert(RBNode * &root,Int val){  
    if(root==nil){ root=CreatNode(root,val,RED); return; }  
    Nil(); RBNode *p=Bound(root,val,1);  
    if(p->val==val){ p->cnt++; return; }  
    int dir=(val<p->val)?0:1; RBNode *node=nil;  
    CreatNode(node,val); Connect(p,node,dir);  
    Fixup(root,node);  Nil();
}  
bool Delete(RBNode *&root,Int val){  
    if(root==nil) return false;  
    Nil(); if((RBNode *p=Bound(root,val,0))==nil) return false;  
    if(p->cnt>1){ (p->cnt)--; return true; }  
    if(p->chi[0]!=nil || p->chi[1]!=nil)
        if((RBNode *suc=Cessor(p,1))!=nil || (suc=Cessor(p,0))!=nil)
        		{p->val=suc->val; p->cnt=suc->cnt; p=suc; }  
    int dir=p->pa->chi[0]==p?0:1; p->pa->chi[dir]=nil;  p=p->pa;
    Balance(p,(!dir)?1:-1,1); 
    if(p!=root) delete p; else {RBNode * t=p; root=nil; delete t;}
    Nil();  return true;  
} 
//-------------
void Insert(BFNode * node,Int val){
	BFNode *x=root;
	while(node->chi!=nil){
		x=x->chi;
		if(x->size=4) Split(x);
	}
	if(x->size==2) x.Plus(val);
	else if(x->size==3) x.Plus4(val);
	return x;
}
//----------------
RBNode * Insert(RBNode node,Int key,Int val){
	if(node==nil) return node=CreatNode(node,key,val);
	int cmp=Cmp(key,node->key);
	if(cmp==0) node->val=val;
	else if(cmp<0) Insert(node->chi[0],key,val);
	else Insert(node->chi[1],key,val);
	return Node;
}
void ColorFlip(RBNode * node)
{ node->color^=1; node->chi[0].color^=1; node->chi[1].color^=1; }
//---------
RBNode * Insert(RBNode * node,Int key,Int val){
	if(node==nil) return node=CreatNode(node,key,val,RED);
	int cmp=Cmp(key,node->key);
	if(cmp==0) node->val=val;
	else if(cmp<0) Insert(node->chi[0],key,val);
	else Insert(node->chi[1],key,val);
	if(node->chi[1].color==RED) Rotate(node,0);
	if(node->chi[0].color==RED && node->chi[1].color==RED) Rotate(node,1);
	if(node->chi[0]->color==RED && node->chi[1].color==RED) ColorFlip(node);
	return Node;
}
RBNode * Delete(RBNode * node,Int key){
	if(key<node->key){
		if(node->chi[0]->color==RED && node->chi[0]->chi[0]->color==RED){
			MoveRedLeft(node); node->chi[0]=Delete(node->chi[0],key);
		}else{
			if(node->chi[0]->color==RED) node=LeanRight(node);
			if(key==node->key && node->chi[1]==nil) return nil;
			if(node->chi[1]->color!=RED && node->chi[1]->chi[0]->color!=RED) node=MoveREDRight(node);
			if(node->key==key)
			{ node->key=min(node->chi[1]); node->val=Get(node->chi[1],node->key); node->chi[1]=DeleteMin(node->chi[1]); }
			else node->chi[1]=Delete(node->chi[1],key);
		}
	}
	return Fixup(node);
]

  

posted on 2013-08-19 11:07  Amyc  阅读(308)  评论(0编辑  收藏  举报