如何修复Java AVL树插入/平衡错误

如何修复Java AVL树插入/平衡错误,java,data-structures,Java,Data Structures,我正在为家庭作业写一个AVL树,但我似乎没有得到我想要的结果。出于某种原因,平衡似乎与课堂上给出的示例不一样。这是我的密码: public AVLInsert(File inputFile) { try { Scanner scanner = new Scanner(inputFile); PrintWriter writer = new PrintWriter(new File("output.txt")); AVLNode

我正在为家庭作业写一个AVL树,但我似乎没有得到我想要的结果。出于某种原因,平衡似乎与课堂上给出的示例不一样。这是我的密码:

public AVLInsert(File inputFile)
{
    try 
    {
        Scanner scanner = new Scanner(inputFile);
        PrintWriter writer = new PrintWriter(new File("output.txt"));

        AVLNode node = null;

        while (scanner.hasNextInt())
        {
            if (node == null)
            {
                node = new AVLNode(scanner.nextInt());
            }
            else
            {
                node.insert(scanner.nextInt(), node); // probably broken
            }

            String output = node.printTree(node);
            System.out.println(output);
            writer.println(output + "");

        }

        scanner.close();
        writer.close();

    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}
AVLNode:

public class AVLNode 
{

// 2 pointers for left and right nodes
AVLNode left, right;
int key, balance;
boolean h;

public AVLNode()
{
    left = null;
    right = null;
    key = 0;
    balance = 0;
    h = true;
}

public AVLNode(int key)
{
    left = null;
    right = null;
    this.key = key;
    balance = 0;
    h = true;
}

AVLNode insert(int k, AVLNode p)
{
    if (p == null)
    {
        // insert k at p;
        p = new AVLNode(k);
    }
    else if (k < p.key)
    {
        p.left = insert(k, p.left);

        if (p.h)
        {
            switch (p.balance)
            {
            case 0:
                p.balance--;
                break;

            case 1:
                p.balance = 0;
                p.h = false;
                break;

            case -1:
                AVLNode p1 = p.left;

                if (p1.balance == -1)
                {
                    // do LL
                    LL(p, p1);
                }
                else 
                {
                    // do LR
                    LR(p, p1);
                }
                break;
            }
        }
    }
    else 
    {
        p.right = insert(k, p.right);

        if (p.h)
        {
            switch (p.balance)
            {
            case 0:
                p.balance++;
                break;

            case -1:
                p.balance = 0;
                p.h = false;
                break;

            case 1:
                AVLNode p1 = p.right;

                if (p1.balance == 1)
                {
                    // do RR
                    RR(p, p1);
                }
                else 
                {
                    // do RL -- assuming it's opposite of LR
                    RL(p, p1);
                }
                break;
            }



        }
    }

    return p;
}

void LL(AVLNode p, AVLNode p1)
{
    p.left = p1.right;
    p1.right = p;
    p = p1;
    p.h = false;
}

void LR(AVLNode p, AVLNode p1)
{
    // do LR
    p1 = p.left;
    AVLNode p2 = p1.right;
    p1.right = p2.left;
    p.left = p2.right;
    p2.right = p;
    p2.left = p1;


    switch (p2.balance)
    {
    case 0:
        p.balance = 0;
        p1.balance = 0;
        break;
    case -1:
        p.balance = 1;
        p1.balance = 0;
        break;
    case 1:
        p.balance = 0;
        p1.balance = -1;
        break;
    }

    p = p2;

    p.balance = 0;
    p.h = false;
}

void RR(AVLNode p, AVLNode p1)
{
    p.right = p1.right;
    p1.left = p;
    p = p1;
    p.h = false;
}

void RL(AVLNode p, AVLNode p1)
{
    p1 = p.right;
    AVLNode p2 = p1.left;
    p1.left = p2.right;
    p.right = p2.left;
    p2.left = p;
    p2.right = p1;


    switch (p2.balance)
    {
    case 0:
        p.balance = 0;
        p1.balance = 0;
        break;
    case -1:
        p.balance = 0;
        p1.balance = 1;
        break;
    case 1:
        p.balance = -1;
        p1.balance = 0;
        break;
    }


    p = p2;

    p.balance = 0;
    p.h = false;
}

String printTree(AVLNode p)
{
    String output = "";

    if (p != null)
    {
        output += p.key + "(" + printTree(p.left) + ")(" + printTree(p.right) + ")";
    }

    return output;
}
我的输出:

5()()
5()(6()())
5()(8()())
5(3()())(8()())
5(3(2()())())(8()())
5(3(2()())(4()()))(8()())
5(3(2()())(4()()))(8(6()())())
5(3(2()())(4()()))(8()())
它应该是什么:

5()() 
5()(6()()) 
6(5()())(8()()) 
6(5(3()())())(8()()) 
6(3(2()())(5()()))(8()()) 
5(3(2()())(4()()))(6()(8()())) 
5(3(2()())(4()()))(7(6()())(8()()))
有人知道为什么我的结果与示例不同吗?我有一种感觉,这与我的RL-LR旋转有关,但感谢任何帮助

5()() 
5()(6()()) 
6(5()())(8()()) 
6(5(3()())())(8()()) 
6(3(2()())(5()()))(8()()) 
5(3(2()())(4()()))(6()(8()())) 
5(3(2()())(4()()))(7(6()())(8()()))