二叉树,删除节点问题

jianfengshxy 2008-03-26 06:26:28
erase()是删除二叉树的一个节点,find()函数是返回要删除节点的地址,函数原型是Node*& find(Node*& t,const int& d)
d是要删除的数,返回的是这个数节点的指针的引用

1 bool erase(const int& d)
2 {
3 Node*& pn=find(root,d);
4 if(!pn) return false;
5 if(pn->l!=NULL)
6 insert(pn->r,pn->l); //将要删除节点的左子树,链接到右子树上
7 Node* pr=pn->r; //从这行起,代码要干什么我不明白
8 delete pn;
9 pn=pr;
10 return true;
11 }
53
30 72
14 39 61 84
9 23 34 47 79
以删除30这个数为例find返回30这个节点的地址,pn是地址的引用,假设30节点的地址是0x01,那么pn=0x01,5~6行是将30节点的左子树加到右子树上(节点34),但是如何将39节点链接到53上,我不明白.
...全文
223 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wsqshz 2008-03-29
  • 打赏
  • 举报
回复
pn不就是根节点的左指针域!
jerryhgc 2008-03-29
  • 打赏
  • 举报
回复
显然这个程序是不完整的,删除30结点后根节点的左子树都没有处理。。。
[Quote=引用 9 楼 zhouzongcheng 的回复:]
bool erase(const int& d)
2 {
3 Node*& pn=find(root,d);
4 if(!pn) return false;
5 if(pn->l!=NULL)
6 insert(pn->r,pn->l); //将要删除节点的左子树,链接到右子树上
7 Node* pr=pn->r; //从这行起,代码要干什么我不明白
8 delete pn;
9 pn=pr;
10 return true;
11 }

[/Quote]
wsqshz 2008-03-29
  • 打赏
  • 举报
回复
pr指向要删除节点的右孩子
worldmh 2008-03-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dizuo 的回复:]
C/C++ code Node* pr=pn->r; //保存要删除指针的右孩子,
8 delete pn; //删除节点;
9 pn=pr; //更新pn的值,
10 return true;
11 }
[/Quote]
指针的右孩子,什么意思?
wsqshz 2008-03-29
  • 打赏
  • 举报
回复
一楼回答正确
只要理解:pn是引用指向要删除节点的指针,你的例子中,pn就是53的左指针域。

zhouzongcheng 2008-03-29
  • 打赏
  • 举报
回复
bool erase(const int& d)
2 {
3 Node*& pn=find(root,d);
4 if(!pn) return false;
5 if(pn->l!=NULL)
6 insert(pn->r,pn->l); //将要删除节点的左子树,链接到右子树上
7 Node* pr=pn->r; //从这行起,代码要干什么我不明白
8 delete pn;
9 pn=pr;
10 return true;
11 }
53
30 72
14 39 61 84
9 23 34 47 79
我想问一下?
14连接上了39,然而34和47 何去何从? 是否会把34连接到47上面 但我没有看见相关代码? 请高手指点!
帅得不敢出门 2008-03-29
  • 打赏
  • 举报
回复
erase()是删除二叉树的一个节点,find()函数是返回要删除节点的地址,函数原型是Node*& find(Node*& t,const int& d)
d是要删除的数,返回的是这个数节点的指针的引用

1 bool erase(const int& d)
2 {
3 Node*& pn=find(root,d);
4 if(!pn) return false;
5 if(pn->l!=NULL)
6 insert(pn->r,pn->l); //将要删除节点的左子树,链接到右子树上
7 Node* pr=pn->r; //pr 指向 pn的右子树 (以删除30这个数为例pr指向39)
//假设p_53指向53,此时53节点的左孩子值为30 则p_53->l==pn
8 delete pn; //删除pn 就把找到的节点删除了 (删除节点30) p_53->l==pn但已经是野指针了
9 pn=pr; //再把pr赋给pn 此时pn->data==39 而p_53->l==pn就把39这个结点给接到53那了
10 return true;
11 }
53
30 72
14 39 61 84
9 23 34 47 79

程序本身没有问题 ........
jue222 2008-03-29
  • 打赏
  • 举报
回复
又长了回见识……
zengshi000 2008-03-29
  • 打赏
  • 举报
回复

楼主。你的问题我弄明白了。
因为你的节点定义实这样的
struct Node{
int data;
Node* lchild,rchild;
};
所以
5 if(pn->lchild!=NULL)
6 insert(pn->rchild,pn->lchild); //将要删除节点的左子树,链接到右子树上
7 Node* pr=pn->rchild; //将要删除节点pn的指向右孩子的指针(pn->rchild)用pr保存起来
8 delete pn; //清空节点pn指向的内容
9 pn=pr; //用pn的右孩子(pr)来替代pn。就是说39代替了30的位置
而53的左孩子是30。这样就把39和53连接起来了


53
30 72
14 39 61 84
9 23 34 47 79
Kratos 2008-03-26
  • 打赏
  • 举报
回复
晕,头一次见到删除结点的问题。这样好象使遍历元素顺序发生变化。
wnb0405404 2008-03-26
  • 打赏
  • 举报
回复
来学习了!!
遇树就迷糊啊111
wuyeyuanquli2008 2008-03-26
  • 打赏
  • 举报
回复
see 结点头疼..
con_con 2008-03-26
  • 打赏
  • 举报
回复
占楼学习!
fallinleave 2008-03-26
  • 打赏
  • 举报
回复
为什么没有连上?
pn的值是什么?不光是30节点,同时也是52节点的左指针指向的地方,现在把pn进行了更新,相当于修改了52节点左指针所指向的区域,所以52和39连接上了
jianfengshxy 2008-03-26
  • 打赏
  • 举报
回复
补充一下Node的结构是
struct Node{
int data;
Node* lchild,rchild;
};
jianfengshxy 2008-03-26
  • 打赏
  • 举报
回复
确实pn指向了39节点,但是53节点的Node* lchild指针还是指向30节点,那么52节点和39节点没链接上.
(当然这是我的理解,实际是代码运行正确,解释一下)
ryfdizuo 2008-03-26
  • 打赏
  • 举报
回复
 Node* pr=pn->r;   //保存要删除指针的右孩子,
8 delete pn; //删除节点;
9 pn=pr; //更新pn的值,
10 return true;
11 }

64,849

社区成员

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

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