Java二进制搜索树循环返回空对象引用?

时间:2019-03-29 07:24:28

标签: java loops binary-tree binary-search-tree nodes

我为二进制搜索树编写了一个remove函数,该树使用while循环导航到要删除的特定节点。但是,它永远不会到达那里-它只会迭代未知的次数,然后给我NullPointerException。

我想知道遍历逻辑中是否有错误,但这与我的add函数完全相同,效果很好。

void remove(Comparable newObject){
    if (!isEmpty()){
        Node curr = new Node();
    curr = root;
    boolean isFound = false;
    while (!isFound){
        if (curr.data.compareTo(newObject) == 0){
            if (curr.hasChildren()){
                Node replaceNode = new Node();
                if (curr.leftChild == null){
                    replaceNode = curr.rightChild;
                    while (replaceNode.leftChild != null){
                        replaceNode = replaceNode.leftChild;
                    }
                } else {
                    replaceNode = curr.leftChild;
                    while (replaceNode.rightChild != null) {    
                        replaceNode = replaceNode.rightChild;
                    }
                }
                replaceNode.leftChild = curr.leftChild;
                replaceNode.rightChild = curr.rightChild;
                replaceNode.parent = curr.parent;
                curr = replaceNode;
            } else {
                curr.data = null;
                curr.parent = null;
            }
            listSize--;
            isFound = true;
        } else if (curr.data.compareTo(newObject) == 1) {
            curr = curr.leftChild;
        } else {
            curr = curr.rightChild;
        }
    }
    }
}

我正在使用的数据集产生一个带有左孩子的根,然后是一个左孩子的根。要删除的节点是第一个(左)子节点。但是,给出NullPointerException的行是

if (curr.data.compareTo(newObject) == 0){

我真的不确定是什么原因造成的。任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

首先,不要将变量初始化为new Node(),而是要创建不需要的新节点。像这样做:

void remove(Comparable newObject){
    if (!isEmpty()){
        Node curr = root;

,然后再输入您的replaceNode

if (curr.hasChildren()){
    Node replaceNode;

,我认为它不起作用,因为在代码末尾,您将curr重写为其子级,但是如果它没有子级怎么办?然后,您尝试将null对象与某个对象进行比较,这就是为什么我认为它会抛出NullPointerException