应用题
6.写出在二叉排序树中删除一个结点的算法,使删除后仍为二叉排序树。设删除结点由指针p所指,其双亲结点由指针f所指,并假设被删除结点是其双亲结点的右孩子。描述上述算法。
【正确答案】void Delete(BSTree t,P){ //在二叉排序树t中,删除f所指结点的右孩子(由P所指向)
if(P一>lchild==null){f一>rchild=P一>rchild;free(P);}//p无左子女
else{ //用P左子树中的最大值代替P结点的值
q=P一>lchild;s=q;
while(q一>rchild){ S=q;q=q->rchild;} //查P左子树中序序列最右结点
if(s==p一>lchild) //p左子树的根结点无右子女
{p一>data=s一>data;p一>lchild=s一>lchild;free(S);}
else{p一>data=q一>data;s一>rchild=q一>lehild;free(q);}
}
}
【答案解析】