【问题标题】:BST simple insertion with recursion带递归的 BST 简单插入
【发布时间】:2015-07-20 10:24:47
【问题描述】:

我正在尝试编写一个小函数来将节点插入 BST。 “插入”功能正常工作。我将其更改为“insert2”,但它不起作用。我无法弄清楚为什么它不起作用。运行时“insert”和“insert2”有什么区别?

插入方法

public void insert(Node node, int x) {
    if (x < node.val) {
        if (node.left == null) node.left = new Node(x);
        else insert(node.left, x);
    } else {
        if (node.right == null) node.right = new Node(x);
        else insert(node.right, x);
    }
}

insert2 方法

public void insert2(Node node, int x) {
        if (node == null) {
            node = new Node(x);
            return;
        }
        if (x < node.val) insert2(node.left, x);
        else insert2(node.right, x);
    }

节点定义

public class Node {
    int val;
    Node left, right;
    public Node (int _val) {
        this.val = _val;
    }
}

提前致谢。

【问题讨论】:

  • node 是一个参考。当您分配给node.left 时,您正在改变一个节点对象,当您将一个新节点分配给一个引用参数时,您已经创建了一个不附加到任何东西的新节点。它将在return 之后被垃圾收集,因为在那之后没有对它的引用。
  • 谢谢。您能否详细说明或向我推荐一些文档:)

标签: java recursion tree binary-tree binary-search-tree


【解决方案1】:

Java 是pass by value language。这意味着当您将变量传递给方法时,无论是原始方法还是对象,该方法都无法更改该变量,因为它对该变量一无所知。该方法有它自己的变量,并且为参数变量分配任何新的东西只会在该范围内持续存在,并且不会改变其他绑定或对象。

当你有时:

public static void update(String str) {
  str = "changed";
}

然后做:

String s = "hello";
update(s);
System.out.println(s);

它将打印“hello”,因为虽然“hello”的地址已传递给update,但 update 仅将 局部变量 更新为新字符串的地址。赋值永远不会改变用于应用方法的变量或两个变量指向的对象。

String h = "hello";
String w = "world";
String x = h; // x points to the same string as h
x = w;        // x got it's value changed to point to w
System.out.println(h + " " + w);

最后一个语句打印“hello world”,而不是“world world”,好像赋值改变了前一个对象。

那么在您的 insert 方法中发生了什么?

insert2 将恰好为 null 的 局部变量 覆盖到新节点,但它与传递的原始参数无关。新创建的节点只能从该范围访问,因此当它返回时,新节点已准备好进行垃圾收集。传递给原始方法的树从未发生变异,因此它永远不会获得新值。

如果您查看insert,它需要一个非空节点并更改该节点或其后代之一的右或左属性。因此,当您检查原始参数时,树发生了变化,因为它没有改变参数,而是对象本身。

变异对象与变异变量不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 2021-10-03
    • 2021-12-11
    • 2014-04-24
    • 2020-08-16
    • 2020-03-05
    • 1970-01-01
    相关资源
    最近更新 更多