我读了一个postorder遍历应用程序来删除二进制树和用c ++编写的代码。 我想知道如何为java编写此代码。我认为我们必须以后序方式将节点设置为null。
void delete(Node root)
{
if (root!=null){
delete(root.left);
delete(root.right);
}
root=null;
}
答案 0 :(得分:2)
root = null
C ++不是垃圾收集,而是Java。在Java中,一旦对象不再具有对它的任何引用,它将自动从内存中删除。如果垃圾收集对象的所有引用对象都没有其他引用,那么它们也将被删除。该位解决了您的问题:如果root下的节点没有任何外部引用,它们将在root之后自动删除。
答案 1 :(得分:1)
平凡root = null;
。但是,与C ++存在差异,因为Java无法更改传递的变量:
delete(root);
永远不会将root设置为其他内容。这是一个设计原则,使Java在软件工程意义上更加定性(不易出错),而不是C ++(Node *&)。
您需要使用返回值,因为没有输出值。 一个修改过的例子:
Node deleteSubtree(Node tree, Object value) {
if (tree == null) {
return null;
}
if (value.equals(tree.value)) {
return null; // Deleting a subtree
}
tree.left = delete(tree.left, value);
tree.right = delete(tree.right, value);
return root;
}
NOde root = ...
root = delete(root, "war");
这将删除以" war"。
为根的子树答案 2 :(得分:0)
您只需要从根目录取消链接左右节点:
void delete(Node root)
{
if (root!=null){
delete(root.left);
root.left = null;
delete(root.right);
root.right = null;
}
}
将root
设置为null是没用的,因为它是一个局部变量,无论如何都会在方法返回时取消链接。它也不会影响调用方法中的值,因此它根本没有效果。
答案 3 :(得分:0)
只需执行root = null,垃圾收集器将在垃圾收集期间删除整个树,因为程序中没有对树根的引用。
答案 4 :(得分:0)
public class HomeActivity{
public User mUser;
...
}
客户将调用如下: tree1.deleteTreeRef();