Java,AVL树,无法执行右旋转

Java,AVL树,无法执行右旋转,java,object,reference,binary-tree,avl-tree,Java,Object,Reference,Binary Tree,Avl Tree,我正在使用Java实现一个AVLTree类,我遇到了一些神秘的问题: AVLTree类定义如下所示:注意,有一个嵌入类AVLNode public class AVLTree { private AVLNode root; private int size; //EMBEDDED CLASS BEGINS private static class AVLNode { int data; int height; AVLNode left; AVLNode righ

我正在使用Java实现一个AVLTree类,我遇到了一些神秘的问题:

AVLTree类定义如下所示:注意,有一个嵌入类AVLNode

public class AVLTree {
private AVLNode root;
private int size;

//EMBEDDED CLASS BEGINS
private static class AVLNode {
    int data;
    int height;
    AVLNode left;
    AVLNode right;

    public AVLNode(int x) {
        this.data = x;
        this.height = 1;
        this.left = null;
        this.right = null;
    }

}

//EMBEDDED CLASS ENDS
public AVLTree(){
    root=null;
    size=0;
}//blahblahblah
旋转器函数是这样的

public AVLNode rotateR (AVLNode node) {
    if (node.left == null) {
        return node;
    }
    else {
        AVLNode temp = node.left;
        node.left = temp.right;
        temp.right = node;
        node.height = Math.max(getHeight(node.left), getHeight(node.right)) + 1;
        temp.height = Math.max(getHeight(temp.left), getHeight(temp.right)) + 1;
        return temp;
    }
}
当调用此函数作为

a.root = rotateR(a.root);
一切都好。树确实在旋转; 然而,当我写这篇文章时:

AVLNode temp = a.root.right;
temp = rotateR(temp);
子树不旋转

我一直在寻找旋转器函数的例子,但它们看起来都和我的相似。所以我猜当参数为tempa.root.right时,函数只是复制了temp,但没有更改原始节点。但这种猜测无法解释当参数为.root时,原始值为什么会发生变化


有人能帮我吗

除非您明确要求,否则Java不会复制对象。它不是C++。当您指定一个对象变量时,您真正做的是复制一个引用

旋转节点时,需要更新父节点以指向其新的子节点。唯一的例外是在旋转没有父节点的根节点时

AVLNode temp = a.root.right;
temp = rotateR(temp);

AVLNode temp = a.root.right;
a.root.right = rotateR(temp);

这两段代码的作用不同。在第一个示例中,您只是重新分配局部变量temp。在第二种情况下,您将更新旋转节点的父节点以指向其新的子节点。

这应该可以正常工作。我按原样尝试了你的方法,为我工作。可能是打印错误,或者与其他旋转一起使用时出错,或者输入树不应该旋转。请记住,您应该打印temp而不是a.root树,因为它是硬拷贝。

谢谢您的回复!我试过你的代码片段,发现它们很重要!从您的回复中,我碰巧理解了为什么二叉树插入函数在Java和C++中具有不同的返回类型:在Java中,它们需要返回一个节点,以便父节点可以正确链接到该节点。而在C++中,我们可以使用引用或指针,不需要返回一个节点。谢谢您的及时回复!事实上,打印功能很好。但是我无法将父节点与其子节点链接。