尝试提一个小优化

尝试提一个小优化

private Node removeMin(Node node) {
   if (node.left == null) {
       Node right = node.right;
       node.right = null;
       return right;
   }
   node.left = removeMin(node.left);
   return node;
}

改成

private Node removeMin(Node node) {
   if (node.left == null) {
       Node right = node.right;
       node.right = null;
       return right;
   }
   if (node.left.left == null)
       node.left = removeMin(node.left);
   return node;
}

感觉只有删除一个节点后,上一个节点才需要对left赋值,其他点击不需要再次对left赋值了

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

这个代码是不正确的。


如果 root.left.left != null 的话,调用 removeMin(root),你的代码将什么都不做,直接返回 root。

  • 慕尼黑4942162 提问者 #1
    public E removeMin() { E e = minimum(); removeMin(root); return e; } private Node removeMin(Node node) { if (node.left == null) { Node right = node.right; node.right = null; return right; } if (node.left.left == null) node.left = removeMin(node.left); return node; } 老师,我的想法是这样的: 我只关注最后一个左节点,只要递归到他,把他的右节点能给到上一个节点,作为上一个节点的left即可。只要这里执行到,递归就应该结束。 递归到最后一个左节点,把最后一个左节点的右节点返回回去,就会执行到倒数第二个做节点的: if (node.left.left == null) node.left = removeMin(node.left); 执行到这里后,就跳出了递归,因为再之上的左节点不需要重新给left赋值。此时递归返回root还是谁,甚至是null,感觉没关系。因为 我不需要删除完后用root再接收一次,也就是不需要执行root = removeMin(root);递归没有对root修改,所以不需要再接收一次。 这么做完后,测试了几次也都正确,root也没有改变还是最初的root。怎么不正确呢?
    2020-09-18 14:22:15
  • liuyubobobo 回复 提问者 慕尼黑4942162 #2
    BST<Integer> bst = new BST<>(); bst.add(5); bst.add(4); bst.add(3); bst.removeMin(); System.out.println(bst.minimum()); 上面的代码应该删掉了 3,最终的打印结果应该是 4,用你的逻辑结果还是 3,你的 removeMin 不会删除任何节点。跟踪一下试试看?
    2020-09-18 14:29:13
  • 慕尼黑4942162 提问者 回复 liuyubobobo #3
    嗯嗯,明白了,老师。多谢多谢。知道问题在哪里了。 添加这么一个判断之后,如果层级超过2层,其实就无法形成递归调用了。 改成这样就行: private Node removeMin(Node node) { if (node.left == null) { Node right = node.right; node.right = null; return right; } if (node.left.left == null) node.left = removeMin(node.left); else removeMin(node.left); return node; } 这样就造成调用两次remove,else中的remove只是不会给其他不需要重新赋值left的节点再次赋值了。最终还是把代码跟老师的统一了^__^。 瞎整一通,不过对这个递归认识加深了^__^
    2020-09-18 15:06:43
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星

相似问题

登录后可查看更多问答,登录/注册

算法与数据结构
  • 参与学习       2594    人
  • 解答问题       1091    个

慕课网算法名师Liuyubobobo,5年集大成之作 从0到工作5年,算法与数据结构系统解决方案

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师