struct BinSearchNode;
typedef struct BinSearchNode *PBinSearchNode;
struct BinSearchNode{
keyType key;
PBinSearchNode llink,rlink;
};
typedef struct BinSearchNode *BinSearchTree;
typedef BinSearchTree *PBinSearchTree;
int search(PBinSearchTree ptree, KeyType key,PBinSearchNode *position)
{
PBinSearchNode p,q;
p = *ptree;
q = p;
while(p!=NULL) {
q = p;
if(p->key == key) {
*position = p;
return 1;
}
else if(p->key > key)
p=p->llink;
else p = p->rlink;
}
*position = q;
return 0;
}
int insert(PBinSearchTree ptree, KeyType key){
PBinSearchNode p,position;
if(Search(ptree, key,&position) == 1)
return 1;
p = (PBinSearchNode)malloc(sizeof(struct BinSearchNode));
if(p==NULL)
{
printf("Error!\n");
return 0;
}
p->key = key; p->llink = p->rlink = NULL;
if(position == NULL) *ptree = p;
else if(key<position->key) position->llink = p;
else position->rlink = p;
return 1;
}
int createSearchTree(PBinSearchTree ptree, SeqDictionary *dic)
{
int i;
*ptree = NULL;
for(i=0; i<dic->n;i++)
if(!insert(ptree, dic->element[i].key)) return 0;
return 1;
}
int delete(PBinSearchTree ptree, KeyType key){
PBinSearchNode parentp, p ,r;
p = *ptree;
parentp = NULL;
while(p!=NULL) {
if(p->key == key) break;
parentp = p;
if(p->key > key) p=p->llink;
else p=p->rlink;
}
if(p==NULL) return 0;
if(p->llink == NULL){
if(parentp == NULL)
*ptree = p->rlink;
else if(parentp->llink == p)
parentp->llink = p->rlink;
else
parentp->rlink = p->rlink;
}
else {
r = p->llink;
while(r->rlink!=NULL) r = r->rlink;
r->rlink = p->rlink;
if(parentp == NULL) *ptree = p->llink;
else if(parentp->llink == p)
parentp->llink = p->llink;
else
parentp->rlink = p->llink;
}
free p;
return 1;
}