Java 实现AVL树插入

Java 实现AVL树插入,java,data-structures,tree,avl-tree,Java,Data Structures,Tree,Avl Tree,我需要在内部实现AVL树 该算法可在上找到 以下是我的全部代码 rotateLeft被调用两次,但如果逻辑正在工作,则对于以下输入可能只应调用一次: 2-3(根部)-4(右侧)-5(右侧)-6(右侧) 我应该得到什么: 2(BF=0)3(BF=-1)4(BF=0)5(BF=0)6(BF=0) 3(BF=-1)2(BF=0)5(BF=0)4(BF=0)6(BF=0) 我得到的: 2(BF=0)3(BF=-2)3(BF=0)4(BF=-1)4(BF=0)5(BF=0)6(BF=0) 3(BF=-2)

我需要在内部实现AVL树

该算法可在上找到

以下是我的全部代码

rotateLeft被调用两次,但如果逻辑正在工作,则对于以下输入可能只应调用一次:
2-3(根部)-4(右侧)-5(右侧)-6(右侧)

我应该得到什么:
2(BF=0)3(BF=-1)4(BF=0)5(BF=0)6(BF=0)
3(BF=-1)2(BF=0)5(BF=0)4(BF=0)6(BF=0)

我得到的:
2(BF=0)3(BF=-2)3(BF=0)4(BF=-1)4(BF=0)5(BF=0)6(BF=0)
3(BF=-2)2(BF=0)4(BF=-1)3(BF=0)5(BF=0)4(BF=0)6(BF=0)

注:这是来自hackerrank的问题,可在

/*类节点定义为:
类节点
int-val//价值
int-ht//高度
左淋巴结//左撇子
节点权//对的孩子
*/
静态节点插入(节点根,int val)
{
Node newNode=新节点();
newNode.val=val;
插入(根,val);
//顺序(根);
返回根;
}
静态int insertT(节点根,int val){
Node newNode=新节点();
Node tempNode=root;
newNode.val=val;
int-bf=0;
int-pbf=0;
if(tempNode.left==null&&tempNode.val>val){
tempNode.left=newNode;
bf=setHt(tempNode.left)-setHt(tempNode.right);
返回高炉;
}
if(tempNode.right==null&&tempNode.valval){
pbf=插入(tempNode.left,val);
bf=setHt(tempNode.left)-setHt(tempNode.right);
如果(bf==2){
如果(pbf==-1){
tempNode.left=rotateLeft(tempNode.left,tempNode.left.right);
}
tempNode=rotateRight(tempNode,tempNode.left);
}
bf=setHt(tempNode.left)-setHt(tempNode.right);
返回高炉;
}

if(tempNode.right!=null&&tempNode.val您的问题是什么?非常好的观点。我更新了问题,使其更为明显。
/* Class node is defined as :
class Node 
   int val;   //Value
   int ht;      //Height
   Node left;   //Left child
   Node right;   //Right child

*/

static Node insert(Node root,int val)
{
   Node newNode = new Node();
   newNode.val = val;

   insertT(root, val);        

   //inOrder(root);

   return root;
}

static int insertT(Node root,int val){
    Node newNode = new Node();
    Node tempNode = root;
    newNode.val = val;
    int bf = 0;
    int pbf = 0 ;

    if (tempNode.left==null && tempNode.val>val){
        tempNode.left = newNode;
        bf = setHt(tempNode.left) - setHt(tempNode.right); 
        return bf;
    }
    if (tempNode.right==null && tempNode.val<val){
        tempNode.right = newNode;
        bf = setHt(tempNode.left) - setHt(tempNode.right);
        return bf;
    }

    if (tempNode.left!=null && tempNode.val>val){
       pbf = insertT(tempNode.left, val); 
       bf = setHt(tempNode.left) - setHt(tempNode.right);
       if (bf==2) {
           if (pbf==-1){
               tempNode.left = rotateLeft(tempNode.left, tempNode.left.right);
           }
           tempNode = rotateRight(tempNode,tempNode.left);
       }
       bf = setHt(tempNode.left) - setHt(tempNode.right);  
       return bf;
    }

    if (tempNode.right!=null && tempNode.val<val){
       pbf = insertT(tempNode.right, val);   
       bf = setHt(tempNode.left) - setHt(tempNode.right); 
       if (bf==-2) {
           if (pbf==1){
               tempNode.right = rotateRight(tempNode.right, tempNode.right.left);
           }
           tempNode = rotateLeft(tempNode,tempNode.right);
       }
       bf = setHt(tempNode.left) - setHt(tempNode.right); 
       return bf;
    } 

    return bf;
}

static void inOrder(Node root) {
    if (root.left!=null) inOrder(root.left);
    System.out.print(root.val + ", ");
    if (root.right!=null) inOrder(root.right);
}

static int setHt(Node root) {
    if(root!=null) {
        root.ht = Math.max(setHt(root.left),setHt(root.right)) + 1;
        return root.ht;
    }

    return -1;
}

static Node rotateRight(Node root, Node leftChild) {
    Node tempNode = new Node();
    tempNode.val = root.val;
    tempNode.ht = root.ht;
    leftChild.right = tempNode;
    root = leftChild;
    setHt(root);
    //System.out.println("rr");
    //inOrder(root);
    return root;
}

static Node rotateLeft(Node root, Node rightChild) {
    Node tempNode = new Node();
    tempNode.val = root.val;
    tempNode.ht = root.ht;
    rightChild.left = tempNode;
    root = rightChild;
    setHt(root);
    //System.out.println("rl");
    //inOrder(root);
    return root;
}