int DeleteBinSTree(BinSTree &bt,KeyType k){ //二叉排序树bt中删除结点值为k的结点
BinSTree p,q,f,s;
p=bt;
while(p!=NULL&&p->data!=k){ //找到值为k的结点p
f=p; //指向待删结点p的双亲结点
if(p->data>k) p=p->lchild; //结点值为k的结点在当前结点p的左子树上
else p=p->rchild; //结点值为k的结点在当前结点p的右子树上
}
if(p==NULL) return 0; //没有找到值为k的结点
if(p->lchild==NULL){ //待删结点p左子树为空 (此时不知道p是f的左还是右子树)
if(p==bt){ //待删除结点为根节点,让bt指向p的右子树
bt=p->rchild;
}
else if(p==f->lchild) f->lchild=p->rchild; //p为f的左孩子
else f->rchild=p->rchild; //p为f的右孩子
free(p); //释放结点空间
return 1;
}
else{ //待删结点p左子树非空
q=p;
s=p->lchild;
while(s!=NULL){ //找到p左子树s中最右下结点q,也即左子树中最大结点
q=s;
s=s->rchild;
}
if(p==q){ //p的最右下结点就是p的左孩子
q->lchild=s->lchild; //让p左孩子指针指向s的左孩子
}
else{
q->rchild=s->lchild; //让s的双亲结点q右指针指向s的左子树
}
p->data=s->data; //把p的data值变成s的data值(相当于用s结点代替p结点)
free(s);
return 1;
}
}