写出在二叉排序树中删除一个结点的算法 使删除后仍为二叉排序树。设删除结点由指针p所指 其双亲
问题详情
写出在二叉排序树中删除一个结点的算法,使删除后仍为二叉排序树。设删除结点由指针p所指,其双亲结点由指针f所指,并假设被删除结点是其双亲结点的右孩子。用高级语言将上述算法写为过程形式。
请帮忙给出正确答案和分析,谢谢!
参考答案
正确答案:void Delete(BSTree tP)//在二叉排序树t中删除f所指结点的右孩子(由P所指向)的算法{if(p->lchild==null){f->rchild=p->rchild;free(P);}//p无左子女else//用P左子树中的最大值代替P结点的值{q=p->lehild;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->lchild;free(q);}}}//Delete
voidDelete(BSTreet,P)//在二叉排序树t中,删除f所指结点的右孩子(由P所指向)的算法{if(p->lchild==null){f->rchild=p->rchild;free(P);}//p无左子女else//用P左子树中的最大值代替P结点的值{q=p->lehild;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->lchild;free(q);}}}//Delete