考虑三种情况:
- 要删除是的是叶结点:直接删除,并再修改其父结点指针——置为NULL
- 要删除的结点只有一个孩子结点:将其父结点的指针指向要删除节点的孩子结点
- 要删除的结点有左、右两棵子树:用另一结点替代被删除结点:右子树的最小元素或者左子树的最大元素
BinTree Delete(ElementType X,BinTree BST)
{
Posititon 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;
}