二叉查找树

typedef int Int;
struct BSTNode{
	BSTNode *kid[2],pa;
	Int val;
	int cnt;
}*root,*nil;
nil=new BSTNode();
root=nil;
BSTNode * Search(BSTNode * node,Int val){
	while(node!=nil && val!=node->val){
		int drct=(val<node->val)?0:1;
		node=node->kid[drct];
	}
	return node;
}
BSTNode * Extrema(BSTNode * node,int drct){
	while(node->kid[drct]!=nil)
		node=node->kid[drct];
	return node;
}
BSTNode * Cessor(BSTNode * node,int drct){
	if(node->kid[drct]!=nil) return Extrema(node->kid[drct],1-drct);
	BSTnode * p=node->pa;
	while(p!=nil && p->kid[drct]==node){
		node=p; p=p->pa;
	}
	return p;
}
void InitNode(BSTNode * node,Int val,int cnt=1){
	if(node!=nil) delete node; node=new BSTNode();
	node->val=val; node->cnt=cnt;
	node->kid[0]=node->kid[1]=node->pa=nil;
}
void Insert(BSTNode * pos,Int val){
	if(pos==nil)
	{ Initnode(pos,val); return; }
	BSTNode * node=new BSTNode();
	InitNode(node,val,1);
	BSTNode *p=pos;
	while(p->val!=val){
		int drct=(val<p->val)?0:1;
		if(p->kid[drct]==nil)
		{ node->pa=p; p->kid[drct]=node; return;}
		p=p->kid[drct];
	}
	p->cnt++;
}
bool Delete(Int val){
	BSTNode *node=search(root,val);
	if(node==nil) return false;
	if(node->kid[0]==nil && node->kid[1]==0){
		int drct=(node->pa->kid[0]==node)?0:1;
		node->pa->kid[drct]=nil;
		delete node; return true;
	}
	if(node->kid[0]==nil || node->kid[1]==0){
		int padrt=(node->pa->kid[0]==node)?0:1;
		int kidrt=(node->kid[1]==nil)?0:1;
		node->pa->kid[padrt]=node->kid[kidrt];
		node->kid[kidrt]->pa=node->pa;
		delete node; return true;
	}
	BSTNode sucnode=Cessor(node,1);
	int padrt=(node->pa->kid[0]==node)?0:1;
	node->pa->kid[padrt]=sucnode;
	sucnode->kid[0]=node->kid[0];
	sucnode->kid[1]=node->kid[1];
	delete node; return true;
}

 

posted on 2013-08-13 15:13  Amyc  阅读(142)  评论(0编辑  收藏  举报