Java 在AVL树中插入并旋转

Java 在AVL树中插入并旋转,java,tree,Java,Tree,我有以下插入AVL树的插入方法 if(node == null){ node = new AVLTreeNode(key); } else if (key == node.getKey()){ //do nothing, duplicate key } else if (key<node.getKey()){ node.setLeft(insert(node.getLeft(), key));

我有以下插入AVL树的插入方法

if(node == null){
        node = new AVLTreeNode(key);  
    }
    else if (key == node.getKey()){
        //do nothing, duplicate key
    }
    else if (key<node.getKey()){
        node.setLeft(insert(node.getLeft(), key));
        if(node.getBalanceFactor() == 2){

            if(key< node.getLeft().getKey()){
                node = rotateWithLeftChild(node);
            }
            else{
                node = doubleRotateWithLeftChild(node);
            }
        }  
    }
    else {
        node.setRight(insert(node.getRight(), key));
        if(node.getBalanceFactor() == -2){

            if(key> node.getRight().getKey()){
            node = rotateWithRightChild(node);
            }
            else{
            node = doubleRotateWithRightChild(node);
            }
        }  

    }

    //set node height to max children+1

    if(node.hasLeft() && node.hasRight()){
    node.setHeight(Math.max(node.getLeft().getHeight(), node.getRight().getHeight())+1);
    }
    else if(node.hasLeft() && node.hasRight() == false){
        node.setHeight(node.getLeft().getHeight()+1);
    }
    else if(node.hasRight() && node.hasLeft() == false){
        node.setHeight(node.getRight().getHeight()+1);
    }
    else{
        node.setHeight(1);
    }

   return node;

但是,如果我先插入1,然后插入2,然后插入3,我会得到一个错误,因为我有一个空指针,似乎rotate方法正在使用键3处理最后一个节点,而不是它的父节点,因此我不确定如何修复此问题,因为框架中没有提供getParent()方法。有什么建议吗?

如果您能为我们突出显示哪一行有空指针,这将很有帮助。我猜是k1.setHeight呼叫-是吗??因为,看看它,如果你先插入1,然后插入2,然后插入3,那么在不运行代码的情况下,我估计在旋转之前,你会有top node=1,top.right=2,top.right.right=3(所有的“.left”引用都是空的)。这意味着调用RotateWithChild时,k1将是顶部节点,因此k1.getLeft()将为null。解决方案是检查这一点,并为这种情况设置一个默认高度(我猜是1)
public static AVLTreeNode rotateWithRightChild( AVLTreeNode k1 )
{
AVLTreeNode k2 = k1.getRight();
    k1.setRight(k2.getLeft());
    k2.setLeft(k1);
    k1.setHeight(Math.max(k1.getLeft().getHeight(), 0)+1);
    k2.setHeight(Math.max(k2.getRight().getHeight(), k1.getHeight())+1);

    return k2;
}