Java的AVL树

Java的AVL树,java,binary-tree,nodes,treenode,avl-tree,Java,Binary Tree,Nodes,Treenode,Avl Tree,我不确定这是否正确,因为这是我第一次使用节点编码。但这是我迄今为止的代码,如果有人可以查看它并帮助我理解我是否做错了什么。此外,我的插入/删除方法也给我带来了困难。教授为此给了我们伪代码,但我似乎无法掌握如何将其解释为Java代码,因为我以前从未做过这种类型的代码。主要是因为有一个if语句来检查树的高度,看看树是否平衡,我如何在这个语句中实现高度?非常感谢您的提示或任何帮助,我已经坚持了一段时间了。谢谢 我也不认为我做的构造器正确,我不确定。insert/remove中的返回可以忽略,它只是放在

我不确定这是否正确,因为这是我第一次使用节点编码。但这是我迄今为止的代码,如果有人可以查看它并帮助我理解我是否做错了什么。此外,我的插入/删除方法也给我带来了困难。教授为此给了我们伪代码,但我似乎无法掌握如何将其解释为Java代码,因为我以前从未做过这种类型的代码。主要是因为有一个if语句来检查树的高度,看看树是否平衡,我如何在这个语句中实现高度?非常感谢您的提示或任何帮助,我已经坚持了一段时间了。谢谢

我也不认为我做的构造器正确,我不确定。insert/remove中的返回可以忽略,它只是放在那里以确保其余代码将被编译

public class AvlNode{

    public static void main(String[]args){

    }
    //constructor
    public class AvlTreeNode{
        private int num;
        private AvlTreeNode left;
        private AvlTreeNode right;

        public AvlTreeNode left(){
            return this.left;
        }

        public AvlTreeNode right(){
            return this.right;
        }

        public int value(){
            return this.num;
        }
    }
    //method to find the number specified on the node
    public AvlTreeNode find(AvlTreeNode t, int x){
        if(t == null){
            return null;
        }
        if( t.value() == x){
            return t;
        }
        else if(x < t.value()){
            return find(t.left(), x);
        }
        else{
            return find(t.right(), x);
        }
    }
    //method to insert a new node and number to a tree
    public AvlTreeNode insert(AvlTreeNode t, int x){
        if(t == null){
            t = new AvlTreeNode(x, null, null);
            return t;
        }
        if(x < t.value()){
            t.left = insert(t.left(), x);
        }
        return t;
    }
    //method to remove a node and number from the tree
    public AvlTreeNode remove(AvlTreeNode t, int x){
        return t;
    }
    //Inorder traversal method, should print out numbers in ascending order if correct
    public void inOrder(AvlTreeNode t){
        if(t != null){
            inOrder(t.left());
            System.out.print(t.value() + " ");
            inOrder(t.right());
        }
    }
    //single rotation of nodes to balance tree, rotating leftwards
    public static AvlTreeNode singleRotateWithLeft( AvlTreeNode k1){
        AvlTreeNode k2 = k1.left;
        k1.left = k2.right;
        k2.right = k1;
        return k2;
    }
    //single rotation of nodes to balance tree, rotating rightwards
    public static AvlTreeNode singleRotateWithRight( AvlTreeNode k2){
        AvlTreeNode k1 = k2.right;
        k2.right = k1.left;
        k1.left = k2;
        return k1;
    }
    //double rotation of nodes towards the left
    public static AvlTreeNode doubleRotateWithLeft( AvlTreeNode k3){
        k3.left = doubleRotateWithRight(k3.left);
        return doubleRotateWithLeft(k3);
    }
    //double rotation of nodes towards the right
    public static AvlTreeNode doubleRotateWithRight( AvlTreeNode k2){
        k2.right = doubleRotateWithLeft(k2.right);
        return doubleRotateWithRight(k2);
    }
}
公共类AvlNode{
公共静态void main(字符串[]args){
}
//建造师
公共类AvlTreeNode{
私有整数;
私有AvlTreeNode左;
私有AvlTreeNode权;
公共AvlTreeNode left(){
把这个还给我;
}
公共AvlTreeNode权限(){
归还这个。对;
}
公共int值(){
返回这个.num;
}
}
//方法查找节点上指定的编号
公共AvlTreeNode查找(AvlTreeNode t,int x){
如果(t==null){
返回null;
}
如果(t.值()==x){
返回t;
}
如果(x
关于构造函数:我认为错误的地方在于,您将用于描述构造函数的AvlTreeNode的内部类弄错了。很可能,您不需要编写显式构造函数,因为默认的(空的)构造函数就可以了

树的构造可视为将其所有节点插入到空树中

关于高度,您可能应该将树的高度视为每个AvlTreeNode的属性(因此,在
num
旁边需要一个
height
变量)。下一步是实现插入和删除,以便使用正确的局部变换/旋转,并适当增加或减少插入节点及其子节点的高度

编辑:我现在看到您的代码使用了一个带有三个参数的构造函数。您可以使用类似于本示例代码中的构造函数

//inner class for the node
public class AvlTreeNode{
    private int num;
    private int height;

    private AvlTreeNode left;
    private AvlTreeNode right;

    //this is the constructor!
    public AvlTreeNode(int value, AvlTreeNode left, AvlTreeNode right){
        this.num = value;
        this.left = left;
        this.right = right;
        this.height = 1;

        if (left != null && left.height() >= height){
            height = left.height() + 1;
        }
        if (right != null && right.height() >= height){
            height = right.height() + 1;
        }
    }

    public AvlTreeNode left(){
        return this.left;
    }

    public AvlTreeNode right(){
        return this.right;
    }

    public int value(){
        return this.num;
    }

    public int height(){
        return height;
    }
}

为了确保我理解这一点,你是说我可以把AvlTreeNode的空类作为一个构造函数,其中只有变量?我也不是很好,也不完全理解is构造函数。我有insert/remove伪代码,但只需要弄清楚如何将其实现为java代码。所以在insert方法中,我可以使用t.left=insert(t.left,x)而不是t.left()?我还应该提到在insert方法下有“return t=new AvlTreeNode(x,null,null)”,我不需要在构造函数中使用显式方法吗?啊,我错过了那段代码。是的,您可能需要一个构造函数,该构造函数将num设置为第一个参数,并将左树和右树设置为第二个和第三个参数。此外,在该构造函数中,您可以根据I是子树的高度来计算高度值。请参阅我的答案编辑:我已向您的内部类添加了一个示例构造函数。