繁体   English   中英

方法不修改通过的原始节点(Java)

[英]Method does not modify original node passed through (Java)

我创建了一个程序,该程序将键/值对存储到二进制搜索树中。 该类包含一个根指针,该根指针跟踪树的根节点。 在构造函数中,this.root设置为null。

以下方法put(K,V)尝试将新的键/值对插入树中。 如果树中已经存在该键,则该方法返回与该键对应的现有值。 如果不是,则通过辅助方法put(K,V,BNode)插入键/值对。 ***通常,我只返回this.put(...),但是在此代码段中,我将其替换为return null,以便可以在其之前添加打印语句,以检查根节点是否被实际修改

我的程序无法插入第一个键/值对。 我将打印语句放入插入并放入方法以检查它们是否正常工作。 在这种情况下,如我们所料,因为插入的是空树,所以curr(只是this.root)在插入之前为null。 我创建一个新节点,并在insert()中调用返回此节点。 现在,curr指向此已创建的节点。 打印语句“ curr key” + curr.key将打印出正确的密钥,表明此节点创建有效。 但是,当我尝试打印this.root.key时,我得到了NullPointerException异常。 在第二种方法中对curr进行的修改是否也应该在第一种方法中也对this.root进行了修改?

//this.root is the root node of this binary search tree
public V put(K key, V val) {
    System.out.println("put reached");
    this.put(key, val, this.root); // original return statement
    System.out.println("root key: " + this.root.key); // checks if root node was modified
// THIS print statement returns a NullPointerException

    return null; // dummy return statement
}

private V put(K key, V val, BNode curr) {
    V originalValue = this.get(key, curr); // returns null if key does not exist
//else returns corresponding key value

    if (originalValue == null) {
        curr = this.insert(key, val, curr); // helper method which uses recursion to insert 
        System.out.println("curr key " + curr.key); // checks if curr was modified
        this.size++;
        this.state++;
    }

    return originalValue;
}

private BNode insert(K newKey, V newValue, BNode n) {
    if (n == null) {
        return new BNode(newKey, newValue); 
    } else if (newKey.compareTo(n.key) < 0) {
        n.left = this.insert(newKey, newValue, n.left);
    } else {
        n.right = this.insert(newKey, newValue, n.right);
    }

    return n;
}

在第二种方法中对curr进行的修改是否也应该在第一种方法中也对this.root进行了修改?

简短的回答:不。这是因为root的值从未更改。

这应该有助于清除问题,并解释为什么这种情况比我能做到的更好: Java是“按引用传递”还是“按值传递”?

简而言之,如果您想将新节点分配为根节点,则需要显式地执行此操作,而无需尝试更改传递给该方法的值,因为这只会更改curr指向的对象。

感谢您的快速回复trappski

如果Java确实是通过引用传递的,那么我在程序中遇到的问题现在就更有意义了。 但是,如果只修改一个重复的BNode而不是原来的树的一部分,为什么这样的递归方法起作用呢?

private BNode deleteMin(BNode n) {
    if (n.left == null) {
        return n.right;
    }

    n.left = this.deleteMin(n.left);
    return n;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM