如何从Java中的二进制搜索树中"删除"节点?

ava*_*obo 2 java binary-search-tree

我用Java创建了一个二叉搜索树,但是我在删除节点部分时遇到了麻烦.当它只有1个儿子的时候我设法擦除了节点,并且我有想法在它有2个儿子时进行删除,无论如何我没有儿子时使用的方法(当它是一片叶子时)不起作用Java的.通常在C++中我会将Node指定为"null",但它在这里不起作用.

if (numberOfSons(node) == 0) {
            node= null;
            return true;
}
Run Code Online (Sandbox Code Playgroud)

这是处理归零部分的代码部分.当我调试它时,它正在引用正确的节点并且它为它分配空值,但是当我返回到我正在为我的树调用delete方法的Frame时,节点仍然在那里.在Java中"空"对象的正确方法是什么?我认为这里的一切都是指针,所以这会起作用,但我认为它没有.

Avi*_*Avi 6

当你正在null做某事时,你只需在你所在的范围内进行参考null.它不会影响任何外面的东西.

让我举例说明.假设你有一个方法foo:

public void foo(Node node) {
    node = null;
    if(node == null) {
      System.out.println("node is null");
    } else {
      System.out.println("node is not null");
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你这样称呼它:

public void doSomething() {
   Node node = new Node();
   foo(node);
    if(node == null) {
      System.out.println("Original node is null");
    } else {
      System.out.println("Original node is not null");
    }   
}
Run Code Online (Sandbox Code Playgroud)

在您的控制台中,您将获得:

node is null
original node in not null
Run Code Online (Sandbox Code Playgroud)

原因是它不是指针,它是一个参考.当您使用null引用时,您只需说"将此引用同义词设为null".这并不意味着该对象被删除,它可能仍然存在于其他地方.没有办法删除java中的对象.您所能做的就是确保没有其他对象指向它们,垃圾收集器将删除对象(有时).