用于删除整个二叉树的Java代码。

时间:2014-07-30 16:06:23

标签: java algorithm binary-tree

我读了一个postorder遍历应用程序来删除二进制树和用c ++编写的代码。    我想知道如何为java编写此代码。我认为我们必须以后序方式将节点设置为null。

void delete(Node root)
{
    if (root!=null){
        delete(root.left);
        delete(root.right);
    }
    root=null;
}

5 个答案:

答案 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();