将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定有序数组: [-10,-3,0,5,9],
一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5
二叉搜索树的中序遍历刚好可以输出一个升序数组。所以题目给出的升序数组就是二叉搜索树的中序遍历。
通过中序遍历加前序遍历或者中序遍历加后序遍历来还原一棵树。然后根据根节点,就可以递归的生成左右子树。
平衡二叉树,既然要做到平衡,我们只要把根节点选为数组的中点即可。
综上,和之前一样,找到了根节点,然后把数组一分为二,进入递归即可。注意这里的边界情况,包括左边界,不包括右边界。
public TreeNode sortedArrayToBST(int[] nums) {
return ToBST(nums,0,nums.length-1);
}
public static TreeNode ToBST(int nums[],int left,int right){
if(left>right)return null;//定义的二分区间为[left,right],无法进行继续递归,直接退出
int mid = (int)(left+right)/2;//二分中值
TreeNode root = new TreeNode(nums[mid]);
root.left = ToBST(nums,left,mid-1);//注意mid-1 对左半部分进行递归
root.right = ToBST(nums,mid+1,right);//注意mid+1 对右半部分进行递归
return root;
}