public BalancedTreeNode<E> insert(BalancedTreeNode<E> node, E value) {
		if(node == null) {
            return new BalancedTreeNode<E>(value);
		}
		
		if(value.compareTo(node.value) < 0) {
            node.left = insert(node.left, value);
            if(height(node.left)-height(node.right) > 1) {
                if(value.compareTo(node.left.value) < 0) {
                    node = rightRotate(node); //LL
                } else {
                    node = leftRightRotate(node); //LR
                }
            }
        } else if(value.compareTo(node.value) > 0) {
            node.right = insert(node.right, value);
            if(height(node.right)-height(node.left) > 1) {
                if(value.compareTo(node.right.value) > 0) {
                    node = leftRotate(node); //RR
                } else {
                    node = rightLeftRotate(node); //RL
                }
            }
        } else {
			System.out.println(value + " is already exists...");
        }
        
		node.height = (height(node.left)>height(node.right)) ? height(node.left)+1 : height(node.right)+1;
        return node;
	}