BST简单插入递归

时间:2015-07-20 10:24:47

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

我正在尝试编写一个小函数来将节点插入到BST中。 "插入"功能正常。我将其更改为" insert2",它不起作用。我无法弄清楚它为什么不起作用。 "插入"之间有什么区别?和" 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;
    }
}

提前致谢。

1 个答案:

答案 0 :(得分:1)

Java是pass by value language。这意味着当您将变量传递给方法(基元或对象)时,该方法无法更改该变量,因为它对该变量一无所知。该方法具有自己的变量,并且为参数变量分配任何新内容仅在该范围内保留,并且不会改变其他绑定或对象。

当你有:

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

并做:

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

它将打印&#34;你好&#34;因为虽然地址是&#34;你好&#34;传递给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);

最后一句话打印&#34; hello world&#34 ;, not&#34; world world&#34;好像赋值变异了前一个对象。

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

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

如果你看insert它需要一个非空节点,并在该节点或其中一个后代上改变右或左属性。因此,当你检查原始参数时,树已经改变,因为它没有改变参数,而是对象本身。

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