Java AVL树指针操作

问题描述

我在用Java实现AVL树时遇到问题,请多多帮助, 最好通过解释我的代码有什么问题(我见过不同的实现,并想弄清楚我的问题是什么)。

public class AVLTree<T> {

public AVLNode<T> root; 

int size;

//constructor
public AVLTree() {
    root = null; 
    size = 0;
}

public void add(T obj) {

    //initialize the new node
    AVLNode<T> node = new AVLNode<T>(obj);

    //if the tree is empty than our new node will serve as a root
    if(root == null)
    {
        root = node; 
        size++;
        return;
    }

    add(root,node);


}

private void checkViolations(AVLNode<T> node) {

    int dif = Math.abs(height(node.left) - height(node.right)) ; 

    //there's a violation at our level 
    if(dif > 1) 
    {
        rebalance(node);
    }

    //if we're at the root,tree is balances(AVL) 
    if(node.parent == null) return; 

    //we're not at the top,check parent 
    checkViolations(node.parent);

}

private void rebalance(AVLNode<T> node) {

    //right subtree is bigger than left subtree
    if(height(node.right) - height(node.left) > 1)
    {
        //problem is right-right
        if(height(node.right.right) > height(node.right.left))
            node = leftRotation(node);

        //problem is right-left
        else 
            node = rightLeftRotation(node);
    }

    //left subtree is bigger than right subtree
    else 
    {
        //problem is left-left
        if (height(node.left.left) > height(node.left.right))
            node = rightRotation(node);

        //problem is left-right
        else 
            node = leftRightRotation(node);

    }

    if (node.parent == null) 
        root = node; 

}

private AVLNode<T> rightLeftRotation(AVLNode<T> node) {

    node.right = rightRotation(node.right);
    return leftRotation(node);
}

private AVLNode<T> leftRightRotation(AVLNode<T> node){

    node.left = leftRotation(node.left);
    return rightRotation(node);
}

private AVLNode<T> rightRotation(AVLNode<T> node) {

    AVLNode<T> temp = node.left;

    node.left = temp.right;
    
    temp.parent = node.parent;

    temp.right = node;

    node.parent = temp;

    return temp;

}

private AVLNode<T> leftRotation(AVLNode<T> node) {

    AVLNode<T> temp = node.right;

    node.right = temp.left;
    
    temp.parent = node.parent;

    temp.left = node;
    
    node.parent = temp;

    return temp; 


}

private int height(AVLNode<T> node) {

    //base case
    if(node == null) return 0;

    return 1 + (Math.max(height(node.left),height(node.right)));

}

private void add(AVLNode<T> parent,AVLNode<T> newNode) {

    if(((Comparable<T>)newNode.data).compareto(parent.data) > 0)
    {
        if(parent.right == null)
        {
            parent.right = newNode;
            newNode.parent = parent;
            size++;
        }
        else add(parent.right,newNode);
    }
    else 
    {
        if(parent.left == null)
        {
            parent.left = newNode;
            newNode.parent = parent;
            size++;
        }

        else add(parent.left,newNode);
    }
    checkViolations(newNode);
}
}

我正在尝试按此顺序(从左到右)添加一个数字:1,2,3,4,5

直到4点,一切似乎都很顺利。

谢谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)