二叉搜索树删除节点问题
看书看到二叉搜索树删除节点,如下,DeleteBST函数怎么删除结点。
我是这样理解的,DeleteBST找到的结点,传入指向该结点的一个指针T即Delete(T)
删除了以后,T指向的结点的父节点没有做修改,父节点指向了一个释放了空间的结点?!
是书错了还是我理解错了?求解析!!
Status Delete(BiTree &p)
{
// 从二叉排序树中删除结点p,并重接它的左或右子树
BiTree q,s;
if (!p->rchild) { // 右子树空则只需重接它的左子树
q = p; p = p->lchild; free(q);
} else if (!p->lchild) { //左子树空则只需重接它的右子树
q = p; p = p->rchild; free(q);
} else { // 左右子树均不空
q = p; s = p->lchild;
while (s->rchild) // 向右到尽头
{ q = s; s = s->rchild; }
p->data = s->data;
if (q != p)
q->rchild = s->lchild; // 重接*q的右子树
else //p=q是什么情况呢?
q->lchild = s->lchild; // 重接*q的左子树
free(s);
}
return TRUE;
} // Delete
Status DeleteBST(BiTree &T,KeyType key)
{
// 若二叉排序树T中存在关键字等于key的数据元素时,
// 则删除该数据元素结点p,并返回TRUE;否则返回FALSE
if (!T)
return FALSE; // 不存在关键字等于key的数据元素
else {
if (EQ(key, T->data.key))
return Delete(T);// 找到关键字等于key的数据元素
else if (LT(key, T->data.key))
return DeleteBST(T->lchild, key);
else
return DeleteBST(T->rchild, key);
}
} // DeleteBST