思路
两个要点:
- 二叉搜索树。
- 每个节点的左右两个子树的高度差都不超过 1 。
因为给定数组是有序的,那我们很容易就能找到适合做 root 的值,即数组最中间的那个值。
这样把数组分成了左、右两部分,
root 的左节点就是左边数组中最中间的那个值,
root的右节点就是右边数组中最中间的那个值。
递归,直到
- 数组长度为 0 时,返回 null。
- 数组长度为 1 时,返回唯一值构成的节点。
最后返回 root。
复杂度分析
假设树有 n 个节点。
- 时间复杂度O(n),遍历整棵树。
- 空间复杂度O(n),空间复杂度取决二叉树的节点数。
代码
public static TreeNode sortedArrayToBST(int[] nums) {
return sortedArrayToBST(nums, 0, nums.length - 1);
}
private static TreeNode sortedArrayToBST(int[] nums, int left, int right) {
if (right < left) {
return null;
}
if (right == left) {
return new TreeNode(nums[left]);
}
int middle = (left + right) / 2;
TreeNode root = new TreeNode(nums[middle]);
root.left = sortedArrayToBST(nums, left, middle - 1);
root.right = sortedArrayToBST(nums, middle + 1, right);
return root;
}