C语言实现: 删除二进制排序树节点
struct BSTree()
{
int data;
struct BSTree *lchild;
struct BSTree *rchild;
};
void deletet(struct BSTree **t)
{
if(((*t)->lchild==NULL)&&((*t)->rchild==NULL))
(*t)=NULL;
else if((*t)->lchild==NULL)
(*t)=(*t)->rchild;
else if((*t)->rchild==NULL)
(*t)=(*t)->lchild;
else
{
struct BSTree *q=(*t),*s=(*t)->lchild;
while(s->rchild!=NULL)
{
q=s;
s=s->rchild;
}
(*t)->data=s->data;
if(q!=(*t))
q->rchild=s->lchild;
else
q->lchild=s->lchild;
}
}
在主函数中:
t=search(root,key); //已经找到要删除的结点,为t
deletet(&t); //调用删除结点t的函数
以上代码可以成功删除左右子节点不为空的节点. 无法删除,为什么?
||集合||
1个答案
按喜欢排序
似乎我已经看到一种解释,只有分配的变量可以设置为null. null变量不能设置为null. 我不知道这是不是原因,
您可以尝试判断只有左(右)个孩子
|
Chorzen回答了猴子-: 看下一个句子,前几个句子您只是将空孩子分配给* t,并且没有执行其他操作
3年前
NeoTalen回答了monkey-: 是的,除了最后一个条件语句实际上是在树上操作之外,其他三个语句实际上并未修改到树中!
3年前
猴子,谢谢,但是稍后我考虑了一下,这段代码应该只将t变量设置为NULL,而不是将主函数的相应根节点更改为NULL,这相当于没有实质性的更改. 用于输出. 理解不正确吗?
3年前
如果要添加问题,请编辑问题;问题解决后,请采用答案.
在CSDN问答中c 二叉排序树,严格禁止抄袭和复制答案以达到声望点或其他目的的行为,并且一旦发现该标题,便将其禁止使用. 是时候展示真正的技术了!
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-170932-1.html