**(1)**如果删除的结点在叶子结点位置,则直接删除;
**(2)**如果删除的结点只有一个子节点,则将父节点的指针指向要删除的结点的孩子结点;
**(3)**如果删除的结点有左右两个子树,则用另一结点代替被删除的结点:
取右子树的最小元素替代当前结点;
取左子树的最大元素替代当前结点;
BinTree Delete(ElementType X, BinTree BST)
{
Positon Tmp;
if(!BST)
printf("要删除的结点未找到");
else if(X <BST->Data)
BST->Left = Delete(X, BST->Left);//左子树递归删除
else if(X >BST->Data)
BST->Right = Delete(X, BST->Right);
else //找到要删除的结点
if(BST->Left && BST->Right) //有左右儿子
{
Tmp = FindMin(BST->Right); //在右子树中找最小的结点
BST->Data = Tmp->Data; //将右子树中最小的结点替换到要删除结点
BST->Right = Delete(BST->Data, BST->Right);//右子树递归删除
}else //被删除结点有一个或无子节点
{
Tmp = BST;
if(!BST->Left) //有右孩子或无子节点
BST = BST->Right;
else if( !BST->Right) //有左孩子或无子节点
BST = BST->Left;
free(Tmp);
}
return BST
}