左边一半归左子树,右边一半归右子树
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
if(nums.length == 0) return null;
return buildFromArray(nums, 0, nums.length);
}
//把nums中从[begin, end)的数字转换为二叉搜索树
//中间的数字作为根节点,左边一半作为左子树,右边一半作为右子树
public TreeNode buildFromArray(int[] nums, int begin, int end){
int mid = begin + (end - begin)/2;
TreeNode root = new TreeNode(nums[mid]);
//begin 到 mid-1 这一段还有数吗,有的话作为左子树
if(mid != begin) root.left = buildFromArray(nums, begin, mid);
//mid 到 end-1 这一段还有数吗,有的话作为右子树
if(mid+1 != end) root.right = buildFromArray(nums, mid+1, end);
/*
至于判断中为什么 mid != begin 而 mid != end-1
举个简单的例子就知道啦!
通过数组中前三个元素构造数,因为我们是左闭右开的,所以
begin = 1, end = 4 => mid = 2
那么,nums[2]作为根节点
从1(begin)到2(mid)构成左子树,mid大于begin即可
从3(mid+1)到4(end)构成右子树,mid+1要小于end
时刻注意:我们是左闭右开!!!!
*/
return root;
}
}