108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)
思路
由于高度平衡二叉搜索树的每个子树也都是高度平衡二叉搜索树,每个子树包含的结点值的集合对应给定的数组中的连续子数组,因此可以使用递归分治的方式构造高度平衡二叉搜索树,递归的过程中只要指定每个子树包含的结点值的集合对应的连续子数组的下标区间 [start,end] 即可。
递归的终止条件是下标区间为空,即 start>end,此时对应的子树为空。对于其余情况,首先根据 start和 end 计算得到根结点值的下标 mid 并使用该结点值创建根结点,然后分别使用下标区间 [start,mid−1]和 [mid+1,end] 创建根结点的左子树和右子树。
每次都将根结点值取为中间位置左边的下标处的值
/**
* Definition for a binary tree node.
* public class TreeNode {
* public int val;
* public TreeNode left;
* public TreeNode right;
* public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
public class Solution {
public TreeNode SortedArrayToBST(int[] nums) {
return CreateBST(nums, 0, nums.Length - 1);
}
public TreeNode CreateBST(int[] nums, int start, int end)
{
if(start > end)
{
return null;
}
int mid = (end - start) / 2 + start;
return new TreeNode(nums[mid],CreateBST(nums, start, mid - 1),CreateBST(nums, mid + 1, end));
}
}
-
时间复杂度:O(n),其中 n 是数组 nums的长度。每个元素都被访问一次。
-
空间复杂度:O(logn),其中 n 是数组 nums的长度。空间复杂度主要是递归调用的栈空间,由于构造的是高度平衡二叉搜索树,因此递归调用栈的深度是 O(logn)。注意返回值不计入空间复杂度。