问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

下面的二叉查找树在删除叶子结点时会出问题,为什么呢???

发布网友 发布时间:2022-07-13 04:01

我来回答

3个回答

热心网友 时间:2023-10-23 11:29

这个问题是这样的,在你的代码中你删除叶子节点时,只是将该地址的内容释放掉。但其实并没有删除,因为它的父节点还保存有他的地址,即是:
你要删除27这个节点,它的父节点26的rchild指针其实保存了27的地址,然后当用OrderReverse(t); 进行遍历时,26这个节点判断rchild是否为NULL,由于rchild中是原27的地址,并不为NULL,所以还是要去读原27这个地址中的值,但其实里面的内容都被你用free函数给释放掉了。
解决方法是:
可以在结构体里面增加一个保存 父子针的指针变量,这样就可以只用增加一个查找父节点的函数即可实现将rchild或lchild赋值为NULL。不然的话,你的源代码要做很大的改动才行,因为当在你的查找要删除节点是叶节点的时候,你不能够直接传递该节点指针。

热心网友 时间:2023-10-23 11:30

//---------------------------------------------------------------------------
#include <iostream>
#include <malloc.h>
using namespace std;

typedef int keyType;
typedef int elemType;

typedef struct Node
{
keyType key;
elemType otheItem;
struct Node *lchild,*rchild;
}*nodePtr;

nodePtr BSTSearch(nodePtr t,keyType key)
{
if (t == NULL)
{
return NULL;
}
else if(t->key == key)
{
return t;
}

else if (t->key < key)
{

return (BSTSearch(t->rchild,key));
}

else
{
return (BSTSearch(t->lchild,key));

}
}

nodePtr BSTInsert(nodePtr t,nodePtr s)
{

if (t == NULL)
{
t = s;

return (t);
}

else if (t->key > s->key)
{
t->lchild=BSTInsert(t->lchild,s);
}

else
{
t->rchild=BSTInsert(t->rchild,s);

}

return (t);
}

nodePtr BSTCreat(nodePtr t)
{
nodePtr s;
t = NULL;

int a[21] = {30,22,39,12,26,35,51,11,13,25,27,32,37,50,66,17,45,15,20,40,47};
int i;

for (i = 0; i < 21; i++)
{
s = (nodePtr)malloc(sizeof(Node));
s->key = a[i];
s->lchild = NULL;
s->rchild = NULL;
t = BSTInsert(t,s);
}
return t;
}

void OrderReverse(nodePtr t)
{
if (t != NULL)
{
OrderReverse(t->lchild);
cout<<t->key<<" ";
OrderReverse(t->rchild);
free(t);
}

}

nodePtr BSTDelete(nodePtr t,int key) /*删除叶节点*/
{
if (t==NULL) return NULL;
else if (t->key<key) t->rchild =BSTDelete(t->rchild ,key);
else if (key<t->key ) t->lchild =BSTDelete(t->lchild ,key);
else {
delete t;
t=NULL;
}
return t;
}
int main(void)
{

nodePtr t;
t=BSTCreat(t);

t=BSTDelete(t,27);
OrderReverse(t);

return 0;
}
//---------------------------------------------------------------------------

热心网友 时间:2023-10-23 11:30

返回时顺序调一下.否则回不去了.
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么来大姨妈胸会胀 少儿学什么舞蹈 青年学什么舞蹈好 成年人学什么舞蹈 福州企业最低工资标准 2013年厦门的底薪是多少 生产要素的需求有哪些性质 生产要素的需求有何特点? 什么是生产要素需求 微观经济学要素需求什么是条件要素需求?它和要素需求有什么不同?_百度... 红米10X5G版手机链接无线网还没有数据流量网速快 是怎么回事怎么解决? 已知线性表a的第一个接点节的指针为list,写一个算法删除该链表第一个接点,并输出该链表。 超级飞侠12收视率 《赛尔号之前方高能》txt下载在线阅读全文,求百度网盘云资源 《前方高能,男神老婆太危险!》txt下载在线阅读全文,求百度网盘云资源 怀孕初期下面突然流了点血,有什么补救方法 牡丹花的故乡是那 如果有公司盖章却不是老板本人签字合同是否具有法律效益? 2020人民日报健康客户端、健康时报社联合招聘多少人? 人民日报能不能下载 今年大年是几月几号? 大年是几月几日 广西熙光传媒怎么样?熙光传媒是正规公司吗? derlingiioveyou中文怎么读 ovemight是什么意思? g|ove英语是什么意思 how |ove|y英文怎么读 |ove|y的英文怎么/念 电脑采购内存条的问题!140分 绝对高分 诺基亚5530序列号是358307&#47;03&#47;747405&#47;0,code是0573249,RM-504是哪里产的 红米4用wifi超级卡,断断续续,老是连接不上, 红米note手机一连接wifi就卡!就黑屏要怎么办? 蓝色T恤搭配修身包臀裙,显白又清新 ,可甜可盐还可爱,是你想要的吗? 世界最高房子 世界上最贵的一套房子多少钱 喝啤酒能喝奶茶吗? 深圳市睿德信投资集团有限公司怎么样? 天津睿德信资产管理有限公司怎么样? 丰县睿德信财通股权投资合伙企业(有限合伙)怎么样? 请问老师,青年大学习用别人链接做的做题没有登录密码账号有用吗? 徐州市睿德信浚易股权投资合伙企业(有限合伙)怎么样? 皮黑肉儿白,肚里墨样黑,从不偷东西,硬说它是贼(打一动物名) (猜谜语) 身体似雪白,肚子如墨黑,从不偷东西,却说它是贼。 (打一动物?)( ) 1、皮黑肉儿白,肚里墨样黑, 从不偷东西,硬说它是贼。(打一动物) 克莱因瓶的动画演示效果是怎样的? 动物谜语(医生清清白白,肚里喝足墨水。从来不偷东西,被人冤枉叫贼。) 医生清清白白,肚里喝足墨水从来不偷东西,被人冤枉叫贼。 打一动物是什么动物? 克莱因瓶在三维空间造不出来,怎么还有卖这个瓶的? 身上雪雪白,肚里墨墨黑。从不偷东西,却说他是贼。 三省吾身是何意?出自于哪?