题目
很明显使用的是递归,但是就是这个递归我调试了整整两个小时左右,实在是无语了,好在在外界的帮助下完成了
排名比较靠前,下面进行优化
public TreeNode sortedArrayToBST(int[] nums) {
TreeNode root = new TreeNode(nums[nums.length/2]);
int mid = nums.length /2;
if(nums.length == 0)
return null;
return sortedArrayToBST(nums, 0, nums.length-1);
}
public TreeNode sortedArrayToBST(int[] nums,int start, int end){
if(start < end){
return null;
}
int mid = (start + end) /2;
TreeNode root = new TreeNode(nums[mid]);
root.left = sortedArrayToBST(nums, start, mid-1);
root.right = sortedArrayToBST(nums,mid+1,end);
return root;
}
自己将其改成更像是递归的代码:
注意的是length减一和不减一的区别,也就是根节点的区别
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
if(nums.length == 0){
return null;
}
int mid = (0 + nums.length) /2;
TreeNode root = new TreeNode(nums[mid]);
root.left = sortedArrayToBST(nums, 0, mid-1);
root.right = sortedArrayToBST(nums,mid+1,nums.length-1);
return root;
}
public TreeNode sortedArrayToBST(int[] nums,int start, int end){
if(start > end){
return null;
}
int mid = (start + end) /2;
TreeNode root = new TreeNode(nums[mid]);
root.left = sortedArrayToBST(nums, start, mid-1);
root.right = sortedArrayToBST(nums,mid+1,end);
return root;
}
}
其实还能进一步优化
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
if(nums.length==0) return null;
return build(nums,0,nums.length-1);
}
public TreeNode build(int[] nums,int left,int right){
if(left > right) return null;
if(left == right) return new TreeNode(nums[right]);
int mid = (left+right)/2;
TreeNode root = new TreeNode(nums[mid]);
root.right = build(nums,mid+1,right);
root.left = build(nums,left,mid-1);
return root;
}
}