AVL树节点的旋转导致节点消失
问题描述:
我正在尝试在Java中编写AVL树,并且一直在这里停留两晚。当下面的代码运行时,肯定会发生旋转,但最终的结果,例如leftRotate,就是我正在丢失节点。AVL树节点的旋转导致节点消失
public AVLNode leftRotate(AVLNode node){ //receives the grandparent node
AVLNode temp = node.right;
node.right = temp.left;
temp.left = node;
return temp;
}
public AVLNode rightRotate(AVLNode node){
AVLNode temp = node.left;
node.left = temp.right;
temp.right = node;
return temp;
}
public AVLNode rightLeftRotate(AVLNode node){
node.right = rightRotate(node.right);
return leftRotate(node);
}
public AVLNode leftRightRotate(AVLNode node){
node.left = leftRotate(node.left);
return rightRotate(node);
}
如果我添加root = temp
左,右旋转的方法,然后旋转和新的显示成功只发生在第一次去走一走,然后得到的东西都混了。
示例:插入4,5和6.旋转后,temp
保留5作为其 “根”,其中4和6正确包含作为其左侧和右侧子项的键。但是,所有这些在方法结束后都会消失,我的树根的左右子节点现在都是空的。
我知道这是我很想念的东西,但是我无法把头围住它。
我也知道这不是我的addNode
函数,因为当它完成添加所有节点时,不管结果树是二叉搜索树。只有在调用这些函数时才会开始丢失节点。任何帮助?
答
我认为是如何管理内存的问题,而不是使用新的AVLNode实现新的AVLNode并复制信息,因此您没有指向先前对象的指针。 发生什么事是,当你做AVLNode temp = node.left; temp是指向node.left的指针,因此如果返回temp,则所有更改和旋转都将完成到原始节点。
https://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – Oleg