二叉搜索树删除节点问题

clearaelc 2014-10-28 04:26:38
看书看到二叉搜索树删除节点,如下,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
...全文
121 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
clearaelc 2014-10-28
  • 打赏
  • 举报
回复
引用 1 楼 jiuchang 的回复:
Delete的调用参数是引用,调用方式是递归 因此删除一个节点时,可能调用的就是DeleteBST(T->lchild); -->Delete(T); 此时通过引用传递,T->lchild的值就会被修改,而不是指向一个无用的节点
我明白了,Status DeleteBST(BiTree &T,KeyType key),递归时传的是引用,是可以修改到的。 散分,谢谢~~
勤奋的小游侠 2014-10-28
  • 打赏
  • 举报
回复
else if (!p->lchild) { //左子树空则只需重接它的右子树 q = p; p = p->rchild; free(q); 你没有看到这里参数p已经改成它的子树了吗?这里就是修改了指针的值,并没有指空的情况。
jiuchang 2014-10-28
  • 打赏
  • 举报
回复
Delete的调用参数是引用,调用方式是递归 因此删除一个节点时,可能调用的就是DeleteBST(T->lchild); -->Delete(T); 此时通过引用传递,T->lchild的值就会被修改,而不是指向一个无用的节点

64,666

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧