public static void Main()
Console.WriteLine("Hello World");
public static void Test1()
AVLTree tree = new AVLTree();
public static void Test2()
AVLTree tree = new AVLTree();
public Node(Object data){
this.left = this.right = null;
public void printInorder(){ printInorder(root); }
public void printInorder(Node n)
Console.Write(n.data + "(h_" + n.height + ")" + " ");
public void Add(Object data){ root = Add(root, data); }
public Node Add(Node root, Object data)
if ((int)data < (int)root.data){
root.left = Add(root.left, data);
} else if ((int)data > (int)root.data){
root.right = Add(root.right, data);
Console.WriteLine($"invalid data {(int)data}");
int balance = getBalance(root);
if (balance > 1 && (int)data < (int)root.left.data)
return rightRotate(root);
if (balance < -1 && (int)data > (int)root.right.data)
if (balance > 1 && (int)data > (int)root.left.data){
root.left = leftRotate(root.left);
return rightRotate(root);
if (balance < -1 && (int)data < (int)root.right.data){
root.right = rightRotate(root.right);
n.height = 1 + max(getHeight(n.left), getHeight(n.right));
int max(int a, int b){ return (a > b) ? a : b; }
int getHeight(Node n){ if (n == null){ return 0; } else { return n.height; } }
int getBalance(Node n){ if (n == null) { return 0;} else { return getHeight(n.left) - getHeight(n.right); } }