Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 删除后尝试重新平衡AVL树时出现NullPointerException_Java_Avl Tree - Fatal编程技术网

Java 删除后尝试重新平衡AVL树时出现NullPointerException

Java 删除后尝试重新平衡AVL树时出现NullPointerException,java,avl-tree,Java,Avl Tree,我试图在删除时重新平衡AVL树,但我得到一个空指针错误。我在运行调试器和放置print语句时观察到的错误来自balance方法。当我尝试获取高度差时,它抛出一个NullPointerException。当插入AVL树时,我使用了相同的方法,我能够平衡树。但是当尝试删除时,我得到一个NullPointerException。我在插入50、60、40和20时测试了这个案例,因为这已经是一个平衡树了。当我尝试删除60时,在删除60后尝试重新平衡树时,我得到一个NullPointerException。

我试图在删除时重新平衡AVL树,但我得到一个空指针错误。我在运行调试器和放置print语句时观察到的错误来自balance方法。当我尝试获取高度差时,它抛出一个NullPointerException。当插入AVL树时,我使用了相同的方法,我能够平衡树。但是当尝试删除时,我得到一个NullPointerException。我在插入50、60、40和20时测试了这个案例,因为这已经是一个平衡树了。当我尝试删除60时,在删除60后尝试重新平衡树时,我得到一个NullPointerException。我做错了什么

代码:AVLTree.java

public void delete(T data){
    root = delete(root, data); //error line 130
}
private AVLNode<T> delete(AVLNode<T> root, T data){
    if(root==null){
        return root;
    }
    if(data.compareTo(root.getData())<0){
        root.setLeftChild(delete(root.getLeftChild(), data));
    }
    //error line 140 when attempting to delete 60
    else if(data.compareTo(root.getData())>0){
        root.setRightChild(delete(root.getRightChild(), data));
    }
    else{
        if(root.isLeaf()){
            root=null;
        }
        else if(root.getLeftChild()==null){
            root = root.getRightChild();
        }
        else if(root.getRightChild()==null){
            root = root.getLeftChild();
        }
        else{
            T value = findMin(root.getRightChild());
            root.setValue(value);
            root.setRightChild(delete(root.getRightChild(), root.getData()));
        }
    }
    root = rebalance(root);
    updateHeight(root); //error AVLTree.java line 160
    return root;
}
//gets the difference of the left and right node.
private int balance(AVLNode<T> root) {
    return getHeight(root.getLeftChild())-getHeight(root.getRightChild()); //get null pointer exception when attempting to get the difference..
}
//updates the height of the tree.
private void updateHeight(AVLNode<T> root){
    if((root.getLeftChild()==null) && (root.getRightChild()!=null)){
        root.setHeight(root.getRightChild().getHeight()+1);
    }
    //highlights error here:AVLTree.java line 251
    else if((root.getLeftChild() !=null)&&(root.getRightChild()==null)){
        root.setHeight(root.getLeftChild().getHeight()+1);
    }
    else
        root.setHeight(Math.max(getHeight(root.getLeftChild()), getHeight(root.getRightChild()))+1);
}

//re-balances the tree.
private AVLNode<T> rebalance(AVLNode<T> root){
    int difference = balance(root);
    if (difference > 1){
        if(balance(root.getLeftChild())>0){
            root = rotateRight(root);
        }
        else{
            root = rotateLeftRight(root);
        }
    }
    else if(difference < -1){
        if(balance(root.getRightChild())<0){
            root = rotateLeft(root);
        }
        else{
            root = rotateRightLeft(root);
        }
    }
    return root;
}
Error Test.java:128是当我调用方法
tree.delete(60)时
if(root==null) {
  return root;
  }

就在调用重新平衡方法之前。

它看起来像
root.getLeftChild()
root.getRightChild()
返回null,然后它尝试调用
getHeight(null)
,这会给出异常。如果左或右子级不存在,
balance
方法应该做什么?@stvcisco如果(root==null)返回0,我应该有一个case;否,根据@stvcisco:),如果左或右子项之一为空,则需要一个案例。您应该发布异常消息,并指出异常发生的行。@Quilliom i发布了异常消息
if(root==null) {
  return root;
  }