二叉查找树
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; } } // .............. }