java - 使用 getter 作为参数调用函数不会保留引用?

标签 java binary-search-tree recurrence

我的代码有问题,我正在制作二叉搜索树数据结构,当我调用带有节点子节点的函数,然后在函数内为该子节点分配一个值时,它不会更新节点的子节点。

//*** Pseudo-ish Code ***

class BSTNode {

    private BSTNode lChild;
    private BSTNode rChild;
    private int key;

    public BSTNode(int key) {
        this.lChild = null;
        this.rChild = null;
        this.key = key;
    }

    //getters and setters for each field ^
}

class BST {

    private BSTNode root;

    public BST() {
        this.root = null;
    }

    public void insert(BSTNode currentNode, int value) {

        BSTNode newNode = new BSTNode(value);

        if (currentNode == null) {

            currentNode = newNode;
            if (this.root == null) {
                this.root = currentNode;
            }

        } else {

            //ignore the newNode == currentNode value statement right now

            if (newNode.getValue() < currentNode.getValue()) {
                insert(currentNode.getlChild(), value);
            } else if (newNode.getValue() > curNode.getValue()) {
                insert(curNode.getrChild(), value);
            }
        }
    }

    //getters and setters
}

我仍然想自己弄清楚代码,但我很好奇为什么我要运行此代码:

BST testBST = new BST();

testBST.insert(testBST.getRoot(), 10);
testBST.insert(testBST.getRoot(), 7);

System.out.print(testBST.getRoot()); 
System.out.print(" ");
System.out.print(testBST.getRoot().getlChild());

这将输出 10,然后输出 NullPointerException。我知道这是因为不知何故 7 没有被分配为 10 的 lChild,但我不知道为什么?这是我遇到的范围问题,还是因为我在插入函数中使用 getlChild() 递归调用,所以我无权访问实际的私有(private) lChild 字段?

注意:我正在使用 sysout 来调试我的代码,我注意到递归确实有效,并且它确实将 7 正确分配给了 currentNode,但是一旦该函数完成运行,就好像 currentNode 不再引用 lChild的初始根节点。

最佳答案

问题出在这里:

BSTNode newNode = new BSTNode(value);

每次计算机调用递归方法 insert() 时,都会创建一个 new BSTNode()。您只想每次添加一个new BSTNode(),但它会一次又一次地创建节点。例如,您想要添加 3,为此它必须调用 insert() 4 次。它将创建 4 节点,而不是仅创建 1 个节点。

我所做的,除了消除一些错误之外,我还在 BSTNode 类 中创建了递归 insertValue() 方法。因此,您不必每次调用此方法时都跟踪 currentNode。因为,每个节点都会调用自己的 insertValue() 方法。

//*** Pseudo-ish Code ***
class BSTNode 
{
    public BSTNode lChild;
    public BSTNode rChild;
    public int key;

    public BSTNode(int key) 
    {
        this.lChild = null;
        this.rChild = null;
        this.key = key;
    }

    /* Create INSERT function in BSTNode class so that you dont have to give the "CurrentNode" everytime
       you call this method, Now you just have to pass the "Key"*/
    public void insertValue(int insertValue)
    {
        if(insertValue < key)
        {
            if(lChild == null)
                lChild = new BSTNode(insertValue);
            else
                lChild.insertValue(insertValue);
        }
        else if(insertValue > key)
        {
            if(rChild == null)
                rChild = new BSTNode(insertValue);
            else
                rChild.insertValue(insertValue);
        }
        else;
    }
}

class BST 
{
    private BSTNode root;
    public BST() 
    {
        this.root = null;
    }

    // just create the root if not present else it'll call the recursive method of BSTNode class
    public void insert(int value)
    {
        if(root == null)
            root = new BSTNode(value);
        else
            root.insertValue(value);
    }

    // you didn't provide these methods so i wrote my own just to get your code runing 
    public BSTNode getRoot()
    {
        return root;
    }

    public int getRootValue()
    {
        return root.key;
    }
}

public class BSTMain
{
    public static void main(String[] args)
    {   
        BST testBST = new BST();
        testBST.insert(10);
        testBST.insert(7);

        System.out.print(testBST.getRootValue()); 
        System.out.print(" ");
        System.out.print(testBST.getRoot().lChild.key);
    }
}

注意:我添加了一些方法,例如 getRoot() 只是为了让您的代码正常工作,因为您尚未提供它们。

关于java - 使用 getter 作为参数调用函数不会保留引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55401626/

相关文章:

java - 使用 sendTextMessage() 将数据传递到广播接收器

java - 为什么只记录消息,而不记录完整模式?

c++ - 遍历bst使用函数指针的正确方法

c++ - 具有 super 节点算法的二叉搜索树

java - Actor 异常?

mysql - 两个表的子查询

java - 用于在集合中递归存储类对象的数据结构java

java - Spring bean java.lang.NoSuchMethodError 错误

python - 使用动态规划在网格中从左上角到右下角的最大和路径

java - 试图找到一个数的最大素因数