import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param num int整型一维数组 
     * @return TreeNode类
     */
    public TreeNode sortedArrayToBST (int[] num) {
        if(num == null || num.length == 0) return null ;
        TreeNode root = new TreeNode(num[0]) ;
        for(int i = 1 ; i < num.length ; i ++) {
            insert(root , num[i]) ;
            root = rotate(root) ;
        }
        return root ;
    }
    public void insert(TreeNode root , int val) {
        if(root == null) return ;
        if(root.left == null && val < root.val) root.left = new TreeNode(val) ;
        if(root.right == null && val > root.val) root.right = new TreeNode(val) ;
        if(val < root.val) {
            insert(root.left , val) ;        
        } else if(val > root.val) {
            insert(root.right , val) ;
        }
    }
    public TreeNode rotate(TreeNode root) {
        if(height(root.left) - height(root.right) > 1) {
            return rightRotate(root) ;
        } else if(height(root.left) - height(root.right) < 1) {
            return leftRotate(root) ;
        }
        return root ;
    }
    public TreeNode leftRotate(TreeNode root) {
        if(root == null) return null ;
        if(height(root.right.left) - height(root.right.right) > 1) {
            root.right = rightRotate(root.right) ;
        }
        TreeNode n1 = root ;
        TreeNode n2 = root.right ;
        n1.right = n2.left ;
        n2.left = n1 ;
        return n2 ;
        
    }
    public TreeNode rightRotate(TreeNode root) {
        if(root == null) return null;
        if(height(root.left.right) - height(root.left.left) > 1) {
            root.left = leftRotate(root.left) ;
        }
        TreeNode n1 = root ;
        TreeNode n2 = root.left ;
        n1.left = n2.right ;
        n2.right = n1 ;
        return n2 ;
    }
    public int height(TreeNode root) {
        if(root == null) return 0 ;
        int l = height(root.left) ;
        int r = height(root.right) ;
        return  l > r ? l + 1 : r + 1 ; 
    }    
}