TreeNode* arrayToBst(vector<int> &A, int start, int end) {
		if (start == end) {
			return new TreeNode(A[start]);
		} else if (start > end) {
			return NULL;
		}
		int m = (start + end) / 2;
		TreeNode* mNode = new TreeNode(A[m]);
		mNode->left = arrayToBst(A, start, m-1);
		mNode->right = arrayToBst(A, m+1, end);	
		return mNode;
	}
/*
	边界条件可以改为
	if(lh > rh) return NULL;
*/
TreeNode* arrayToBst(vector<int>& nums, int lh, int rh) {
    TreeNode* node = new TreeNode(0);
    // 可以写为  lh + (rh - lh)/2避免overflow
    int mid = (lh + rh) / 2;
    node->val = nums[mid];
    if (lh == rh)
        return node;
    node->right = arrayToBst(nums, mid + 1, rh);
    if (lh == mid)
        return node;
    else
        node->left = arrayToBst(nums, lh, mid - 1);
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
    TreeNode* root;
    if (nums.empty()) {
        return root;
    }
    else {
        return arrayToBst(nums, 0, nums.size() - 1);
    }
}
    /**
     * @param A: A sorted (increasing order) array
     * @return: A tree node
     */
    TreeNode *sortedArrayToBST(vector<int> &A) {
        // write your code here
		return  arrayToBst(A, 0, A.size() - 1);
		
    }