Java 二叉搜索树循环返回空对象引用



我为二叉搜索树编写了一个删除函数,该函数使用 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){

我真的不确定是什么原因造成的。非常感谢任何和所有的帮助。

首先不要

将变量初始化为new Node(),您正在创建您不打算使用的新节点。更像这样:

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

然后再次replaceNode

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

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

最新更新