Java 在AVL树中插入并旋转
我有以下插入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));
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;
}