我试图用Java写一个AVL树,并且已经坚持了两个晚上。当运行以下代码时,肯定会发生轮换,但最终结果是,例如,leftRotate,就是我丢失了节点。
5
如果我向左右旋转方法添加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);
}
,则旋转和新显示仅在第一次出现时成功发生,然后事情全部混淆。
示例:插入4,5然后6.旋转后,root = temp
保持5
" root",正确包含4和6作为其左右儿童的键。但是,在方法结束后,所有这些都消失了,我树的根的左右子节点现在为空。
我知道我失踪了一些小事,但我无法绕过它。
我也知道它不是我的temp
函数,因为当它完成添加所有节点后,生成的树无论如何都是二叉搜索树。只有在调用这些函数时才开始丢失节点。有什么帮助吗?
答案 0 :(得分:0)
我认为是如何管理内存的问题,而不是AVLNode temp = node.left; or AVLNode temp = node.left;
实例化一个新的AVLNode并复制信息,所以你没有指向前一个对象的指针。
发生的事情是当你做AVLNode temp = node.left; temp是指向node.left的指针,因此如果返回temp,则所有更改和旋转都将完成到原始节点。