【正确答案】
【答案解析】在二叉排序树上删除结点,首先要查找该结点。查找成功后,若该结点无左子树,则可直接将其右子树的根结点接到其双亲结点上;若该结点有左子树,则将其左子树中按中序遍历的最后一个结点代替该结点,从而不增加树的高度。
void Delete(BSTree bst, keytype X){ //在二叉排序树bst上,删除其关键字为X的结点
BSTree f, p=bst;
while(p&&p->key !=X) //查找值为X的结点
if(p->key>X){ f=p; p=p->lchild; }
else{f=p; p=p->rchild; }
if(p==null){ printf("无关键字为X的结点/n"); exit(0);}
if(p->lchild==null){ //被删结点无左子树
if(f->lchild==p) f->lchild=p->rchild; //将被删结点的右子树接到其双亲上
else f->rchild=p->rchild;
}
else{q=p; s=p->lchild; //被删结点有左子树
while(s->rchild !=null) //查左子树中最右下的结点(中序最后结点)
{q=s; s=s->rchild; }
p->key=s->key; //结点值用其左子树最右下的结点的值代替
if(q==p)p->lchild=s->lchild; //被删结点左子树的根结点无右子女
else q->rchild=s->lchild; //s是被删结点左子树中序序列最后一个结点
free(s);
}
}