private Node leftRotate(Node root){
        Node newRoot = root.right;
        root.right = root.right.left;
        newRoot.left = root;
        root.height = setHeight(root);
        root.size = setSize(root);
        newRoot.height = setHeight(newRoot);
        newRoot.size = setSize(newRoot);
        return newRoot;
    }
Date 07/04/2014
@author tusroy

Video link - https://youtu.be/rbg7Qf8GkQ4

Write a program to insert into an AVL tree.

AVL tree is self balancing binary tree. Difference of height of left or right subtree
cannot be greater than one.

There are four different use cases to insert into AVL tree
left left - needs ones right rotation
left right - needs one left and one right rotation
right left - needs one right and one left rotation
right right - needs one left rotation

Follow rotation rules to keep tree balanced.

At every node we will also keep height of the tree so that we don't
have to recalculate values again.

Runtime complexity to insert into AVL tree is O(logn).

References 
http://en.wikipedia.org/wiki/AVL_tree
http://www.geeksforgeeks.org/avl-tree-set-1-insertion/
src/com/interview/tree/AVLTree.java