应用题 29.已知二叉树排序树中某结点指针p,其双亲结点指针为fp,p为fp的左孩子。试编写算法,删除p所指结点。
【正确答案】 本题用被删结点右子树中最小值(中序遍历第一个)结点代替被删结点。
void Delete(BSTree bst,P,fp){
//在二叉排序树bst上,删除fp所指结点的左子女(由P所指向)
if(!p一>lchild){fp一>lehild=p一>rchild;free(P);} //p无左子女
e]se if(!p一>rchild){fp一>]child=p一>lchild;free(P);} //p无右子女
else //P有左子女和右子女
{q:=P一>rchild;s=q; //用p右子树中的最小值代替P结点的值
while(q一>lchild){s=q;q=q->lchild;} //查P右子树中序序列最左结点
if(s==p->rchild) //p右子树的根结点无左子女
{p一>data=s一>data;p一>rchild=s一>rchild;frees);}
else{p一>data=q一>data;s一>lchild=q一>rchild;free(q);}
}
}
【答案解析】