请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

波波老师你好,有个问题想请你帮忙解决下

图片描述
private Node remove(Node node , A a){
if (node == null)
return null;
if (a.compareTo(node.a) < 0){
node.left = remove(node.left , a);
return node;
}else if (a.compareTo(node.a) > 0){
node.right = remove(node.right , a);
return node;
}else{
if (node.left == null){
Node rightNode = node.right;
node.right = null;
size --;
return rightNode;
}
if (node.right == null){
Node leftNode = node.left;
node.left = null;
size --;
return leftNode;
}
Node successor = findMin(node.right);
//successor.left = node.left;
**1 successor.right = removeMin(node.right);
2 successor.left = node.left;

node.right = node.left = null ;
return successor;
}
}
波波老师,为什么1和2这两行交换位置这个方法就出错了?

正在回答

2回答

应该和这个是一个问题,请参考:https://coding.imooc.com/learn/questiondetail/62681.html


继续加油!:)

0 回复 有任何疑惑可以回复我~
  • 提问者 爱西瓜同志 #1
    老师,您看我这么理解对不对。“在这个方法中,对successor进行操作,也相当于对node.right进行了操作,(跟链表中您指定的prev和cur的功能是一样的)”
    回复 有任何疑惑可以回复我~ 2019-03-15 13:00:29
  • liuyubobobo 回复 提问者 爱西瓜同志 #2
    successor和node指向不一样。successor指向了以node为根节点的二分搜索树中的最小元素。
    回复 有任何疑惑可以回复我~ 2019-03-15 13:04:24
  • 提问者 爱西瓜同志 回复 liuyubobobo #3
    波波老师,我看了你的其他评论,其中有说到类似的问题,你的回答表达的含义,理解为“对successor进行操作,也相当于对node.right进行了操作”  ,好像也可以啊
    回复 有任何疑惑可以回复我~ 2019-03-15 17:28:39
提问者 爱西瓜同志 2019-03-15 17:26:06

https://img1.sycdn.imooc.com//szimg/5c8b6e000001e45d15960530.jpg

老师,我看到你的这个回复后,我实际debug的时候也发现了这个问题,那么说来“对successor进行的操作就相当于对node.right操作”这句话好像也是对的啊

0 回复 有任何疑惑可以回复我~
  • 通过你的这个表述,我不完全确定你的理解是实际程序的执行过程。但是,successor所指向的节点,不是node.right,而是以node.right为根节点的二分搜索树中的最小节点。这两个节点不一样。当然,如果你说动了这个“以node.right为根节点的二分搜索树中的最小节点”,等同于动了node.right,那么是正确的。这就好像动了链表中的任何一个节点,都等同于动了链表的头结点。但是,我希望你向课程中的ppt图示一样,去画画,真正理解一下,你的逻辑中具体哪个节点指向了谁,为什么整体逻辑出现了问题:)继续加油!:)
    回复 有任何疑惑可以回复我~ 2019-03-16 00:49:04
  • 提问者 爱西瓜同志 回复 liuyubobobo #2
    波波老师,我理解了,谢谢哈,我以后得提高我的表达能力
    回复 有任何疑惑可以回复我~ 2019-03-16 09:07:35
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信