BSTNode * Minimum(BSTNode * node){
while(node->kid[0]!=nil)
node=node->kid[0];
return node;
}
BSTNode * Maxmum(BSTNode * node){
while(node->kid[1]!=nil)
node=node->kid[1];
return node;
}
BSTNode * Search(BSTNode * node,Int val){ // < CLRS
if(node==nil || val==node->val) return node;
if(val<node->val) return Search(node->kid[0],val);
else return Search(node->kid[1],val);
}
BSTNode * Successor(BSTNode * node){ if(node->kid[1]!=nil) return Minimum(node->kid[1]); BSTnode *p=node->pa; while(p!=nil && p->val<node->val) p=p->pa; return p; } BSTNode * predecessor(BSTNode * node){ if(node->kid[0]!=nil) return Maxmum(node->kid[0]); BSTnode *p=node->pa; while(p!=nil && p->val>node->val) p=p->pa; return p; }
void Insert(BSTree *root,int val){
if(root==NULL){
root=new BSTNode();
root->val=val;
return;
}
BSTNode *p=root;
while(val<p->val && p->lhd!=NULL) p=p->lhd;
while(val>p->val && p->rhd!=NULL) p=p->rhd;
if(val<p->val){ p->lhd=new BSTNode(); p->lhd->val=val; }
else if(val>p->val){ p->rhd=new BSTNode(); p->rhd->val=val; }
else p->cnt++;
}
void Insert(BSTNode * pos,Int val){ // CLRS
if(pos==nil)
{ Initnode(pos,val); return; }
BSTNode * node=new BSTNode();
InitNode(node,val,1);
BSTNode *p=pos;
while(p->val!=val){
if(val<p->val){
if(p->kid[0]!=nil){ p=p->kid[0]; continue;
p->kid[0]=node; node->pa=p; return;
}else if(val>p->val){
if(p->kid[1]!=nil){ p=p->kid[1]; continue;
p->kid[1]=node; node->pa=p; return;
}
}
p->cnt++;
}
BSTNode * Search(BSTNode * node,Int val){
while(node!=nil && val!=node->val){
if(val<node->val) node=node->kid[0];
else node=node->kid[1];
}
return node;
}
void Query(BSTree *root,int val){
BSTree *p=root;
while(p->val!=val){
if(val<p->val){
if(p->lhd==NULL) return false;
p=p->lhd; continue;
}
if(val>p->val){
if(p->rhd==NULL) return false;
p=p->lhd; continue;
}
}
return true;
}
void Delete(BSTree *root,int val){
BSTree *p=root;
while(p->val!=val){
if(val<p->val){
if(p->lhd==NULL) return false;
p=p->lhd; continue;
}
if(val>p->val){
if(p->rhd==NULL) return false;
p=p->lhd; continue;
}
}
// ..............
}