AVL树节点的旋转导致节点消失

时间:2017-09-23 05:34:59

标签: java tree nodes

我试图用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函数,因为当它完成添加所有节点后,生成的树无论如何都是二叉搜索树。只有在调用这些函数时才开始丢失节点。有什么帮助吗?

1 个答案:

答案 0 :(得分:0)

我认为是如何管理内存的问题,而不是AVLNode temp = node.left; or AVLNode temp = node.left;实例化一个新的AVLNode并复制信息,所以你没有指向前一个对象的指针。 发生的事情是当你做AVLNode temp = node.left; temp是指向node.left的指针,因此如果返回temp,则所有更改和旋转都将完成到原始节点。