选择中点构造根节点然后递归构造左子树和右子树
因为递归时候要记录一个起始位置一个终止位置, 所以构造一个helper函数
注意中点被构造成root 所以递归带入是mid-1 和mid+1 所以边界条件是start > end
时间复杂度还是一次树遍历O(n),空间复杂度是栈空间O(logn)加上结果的空间O(n),所以额外空间是O(logn),总体是O(n)。
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode sortedArrayToBST(int[] num) {
if (num == null || num.length == 0){
return null;
}
return helper(num, 0, num.length - 1);
}
private TreeNode helper(int[] num, int start, int end){
if (start > end){//因为是mid-1 和mid+1 所以到最后会出现start<end 而不是等于
return null;
}
int mid = (start + end)/2;
TreeNode node = new TreeNode(num[mid]);
node.left = helper(num, start, mid-1);
node.right = helper(num, mid + 1, end);
return node;
}
}
没有评论:
发表评论