题目 将有序数组转换为二叉搜索树
给你一个整数数组 nums
,其中元素已经按 升序 排列,请你将其转换为一棵平衡 二叉搜索树。
示例 1:
输入:nums = [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:
示例 2:
输入:nums = [1,3] 输出:[3,1] 解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums
按 严格递增 顺序排列
解法 二分法 递归
平衡二叉树的要求是:对于树中的每一个节点,左子树和右子树的高度差(也称为平衡因子)的绝对值最多为1。平衡二叉树的目的是确保树的高度尽可能小,以便在执行查找、插入和删除等操作时能够保持较高的效率。
可以使用二分法,每次递归取中间的元素作为本次递归的根节点,递归去添加左子树和右子树。
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
// 二分法 递归
if (nums.length == 2)
return new TreeNode(nums[0], null, new TreeNode(nums[1]));
if (nums.length == 1)
return new TreeNode(nums[0]);
int left = 0, right = nums.length - 1, middle = right >>> 1;
TreeNode root = new TreeNode(nums[middle]);
root.left = sortedArrayToBST(Arrays.copyOfRange(nums, 0, middle));
root.right = sortedArrayToBST(Arrays.copyOfRange(nums, middle + 1, right + 1));
return root;
}
}
这个解法的不足在于每次递归都要创建新的数组,浪费空间。
我们另外创建一个函数,传入同一个函数和左右边界位置来代替——
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
// 二分法 递归
return toTree(nums, 0, nums.length);
}
private TreeNode toTree(int[] nums, int left, int right) {
if (left == right) return null;
int middle = (left + right) / 2;
TreeNode root = new TreeNode(nums[middle]);
root.left = toTree(nums, left, middle);
root.right = toTree(nums, middle + 1, right);
return root;
}
}
空间复杂度也得到了优化