小白求解关于二叉排序树删除结点的一点问题

Lifework_xc 2018-03-04 10:34:42

#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int key;
char data;
struct node *lchild,*rchild;
}BSTnode; //二叉排序树结点
void deletep(BSTnode **bt) //书上形参是引用,但我用的是C,就换成二级指针了
{
BSTnode *q;
q=*bt;
*bt=(*bt)->rchild; //为什么这里赋值右孩子之后,它的父结点就指向它了?
free(q);
}
int deletek(BSTnode **bt,int k)
{
if(bt==NULL)
return 0;
else if(k==(*bt)->key)
{
deletep(bt);
return 1;
}
else if(k<(*bt)->key)
return deletek(&(*bt)->lchild,k);
else
return deletek(&(*bt)->rchild,k);
}

删除只有右孩子的结点,编译结果是正确的,但是我搞不懂*bt=(*bt)->rchild; 这一行,指针变量重新被赋值之后,它的父指针应该还是指向原来的地方啊,求指点!!
...全文
446 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
大佬 我也想问 那个删除函数 删完之后树的节点是怎了连接起来的
Lifework_xc 2018-03-05
  • 打赏
  • 举报
回复
引用 3 楼 codedoctor 的回复:
额写错了,是左节点
谢谢大大 茅塞顿开呀!!
codedoctor 2018-03-05
  • 打赏
  • 举报
回复
额写错了,是左节点
codedoctor 2018-03-05
  • 打赏
  • 举报
回复
emmmm 怎么说呢,你的想法是对的,但是你没有考虑到这个特殊的环境 比如*bt是p的右节点吧。在搜寻这个key的时候,是直接传入的&(p->leftNode),而不是一个指向p->leftNode的节点指针,所以
*bt=(*bt)->rchild;
就相当于
*(p->leftNode)=*(p->leftNode)->rchild;
我相信你能明白
zhagoodwell 2018-03-04
  • 打赏
  • 举报
回复
http://blog.csdn.net/zhagoodwell/article/details/53512081

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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