采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
实际上,我并不清楚删除node节点的操作是在哪一步发生的。 同时,我在参考书上看到的删除操作的关键是先找到pre节点,但在本节中我们编写的代码是否没有涉及到pre节点呢?
删除操作先要找到pre节点,是非递归算法的写法。由于在这一章,我们使用的都是递归算法,所以不牵扯找pre节点。回忆一下,在4-5我们介绍的链表删除节点的时候,由于是非递归算法,所以需要找pre节点。
在我们实现的二叉树的递归删除的过程中,删除实际发生的方式,和我们在5-3至5-5所介绍的链表删除操作的递归算法中删除发生的方式是一模一样的。尤其是我们在5-5所介绍的递归过程的微观运行机制。强烈建议再看一遍,之后再回过头,思考一下这一小节的代码中,我们的二叉树的删除发生在什么时候?发生的时机是完全一致的!
当然,有兴趣,也强烈建议自己尝试写一个二叉树删除最大节点或者最小节点的非递归算法,再仔细体会一下递归算法和非递归算法的不同:)
加油!:)
非常感谢!
老师,我还有一个问题。请问node.right = null这个操作有什么用呢,在我看来这个操作是多余的。我认为代码可以这样写: private Node removeMin(Node node) { if (node.left == null) { Node rightNode = node.right; // node.right = null; size--; return rightNode; } node.left = removeMin(node.left); return node; } 我认为我们只需要返回待删除节点的右子树即可,而不需要再将node.right指向null。
是的,不写是没问题的。由于这次调用返回后,node所指向的空间将引用不可达,所以这个空间可以被正确回收。在这里我只是显式将node和整棵树脱离联系:)
登录后可查看更多问答,登录/注册
动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…
10.4k 16
1.4k 17
1.3k 14