在二叉排序树中删除一结点,要考虑删除点子树的情况,在删除了指定点后,要将其子树重新链接起来,
分情况计论,如果想要删除叶结点,只需将其父结点指向它的指针,指向NULL,再释放它即可,如果被删除结点的右子树为空,可以拿它的左子树结点顶替它的位置,再释放它,如果被删结点的左子树为空,可以拿它的右子树结子顶替它,
如果被删结点左右子树都不空,可以在它的右子树中寻找中序的第一个结点(关键字最小),用它的值填补删结点,之后再业处理这个结点的删除问题,还可找被删除结点左子树的中序的最后一个结点(关键字在左子树中最大),用它来填补被删结点
bool deleteBSTree(BSTree &root ,int e){
BSTree p = NULL ;
BSTree s = NULL ;
BSTree ptr = NULL;
p = searchBS( root,e,ptr);
if(!p)return false;
if(p->lchild!=NULL&&p->rchild!=NULL){
s = p->lchild;
//下面的几步主要是为了使ptr成为删除点p的前驱
if(s->rchild==NULL&&s->lchild==NULL){
ptr = p;
}
while(s->rchild!=NULL){
ptr = s;
s = s->rchild;
}
p->data= s->data;
p=s;
}
if(p->lchild==NULL&&p->rchild!=NULL){
s = p->rchild;
}else if(p->lchild!=NULL&&p->rchild==NULL){
s=p->lchild;
}else if(p->lchild==NULL&&p->rchild==NULL){
if(ptr->data<p->data)
ptr->rchild = NULL;
else if(ptr->data>p->data)
ptr->lchild = NULL;
return true;
}
if(p==root){
root = s;
}else if(ptr->data<s->data){
ptr->rchild = s;
}else if(ptr->data>s->data){
ptr->lchild = s;
}
free(p);
return true;
}
BSTNode *searchBS(BSTNode * root,int e,BSTree &father){
BSTNode * p = root;
father =NULL;
while(p!=NULL&&p->data!=e){
father = p;
if(p->data<e) p=p->rchild;
else p = p->lchild;
}
return p;
}