Message 1
Message 1
import java.util.*;
class AVLTree
{ // Insert == O(log2N)
Node root;
class Node {
int data, height;
Node left, right;
Node(int v)
{ this.data = v; height = 1; }
}
int height(Node n) {
if( n == null ) return 0;
return n.height;
}
int balanceFactor(Node n){
if(n == null) return 0;
return height(n.left) - height(n.right);
}
void insert(int v) {
root = insert(root, v);
}
Node insert(Node n, int v){
if(n == null) return new Node(v);
if(v < n.data) n.left = insert(n.left, v);
else if(v > n.data) n.right = insert(n.right, v);
else if(v == n.data) return n;
int bf = balanceFactor(n);
n.height = Integer.max(height(n.left), height(n.right))+1;
if(bf < -1){
if( v < n.right.data ) n.right = rightRotate(n.right);
return leftRotate(n);
}
if(bf > 1) {
if(v > n.left.data) n.left = leftRotate(n.left);
return rightRotate(n);
}
return n;
}
Node rightRotate(Node r) {
Node x = r.left;
r.left = x.right;
x.right = r;