一.思路
1.判断ptree,ptree->root是否为空
2.判断树中是否存在待删除的数字
3.删除叶子
4.删除单分支
5.删除双分支(狸猫换太子,找到直接后继,直接后继可能为叶子或单分支)
二.图示
三.代码实现
bool Remove(BSTree* ptree, KeyType key)
{
assert(NULL != ptree);
if (ptree->root == NULL)return false;
BstNode* p = FindValue(ptree, key);
if (NULL == p)return false;
//删除双分支
if (p->leftchild != NULL && p->rightchild != NULL)
{
BstNode* pnx = Next(p);//找到直接后继
p->key = pnx->key;
p = pnx;//p为单分支或叶子
}
//删除叶子,单分支,根节点
BstNode* pa = p->parent;
BstNode* child =( p->leftchild!=NULL)?p->leftchild:p->rightchild;
if (NULL != child)child->parent = pa;
if (NULL == pa)
{
ptree->root = child;
}
else
{
if (pa->leftchild == p)
{
pa->leftchild = NULL;
}
else
{
pa->rightchild = NULL;
}
}
Freenode(p);
ptree->cursize -= 1;
return true;
}