42.将有序数组转换为二叉搜索树(学习)
给你一个整数数组 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.如果输入的数组nums为空(即长度为0),则没有元素可以构成树,因此返回null。
二、找到中间元素:
1.使用Math.floor(nums.length / 2)计算数组的中间索引。由于数组索引是从0开始的,这个操作确保了我们总能找到中间位置的元素(如果数组长度是奇数)或两个中间位置元素中的一个(如果数组长度是偶数,这里我们选择靠左的那个)。
2.将中间索引对应的元素值赋给根节点root。
三、递归构建子树:
1.使用slice方法将数组分为两部分:左半部分(nums.slice(0, mid))和右半部分(nums.slice(mid + 1))。注意,这里mid + 1是因为slice的结束索引是不包含的,我们需要从中间元素的下一个位置开始截取右半部分。
2.对左半部分数组递归调用sortedArrayToBST函数,将返回的结果作为根节点的左子树。
3.对右半部分数组递归调用sortedArrayToBST函数,将返回的结果作为根节点的右子树。
四、返回根节点:
1.完成上述步骤后,我们得到了一个以nums[mid]为根节点,左子树由左半部分数组构建,右子树由右半部分数组构建的平衡二叉搜索树。返回这个根节点。
var sortedArrayToBST = function (nums) {
if (nums.length === 0) {
return null;
}
// 找到数组的中间元素
const mid = Math.floor(nums.length / 2);
const rootVal = nums[mid];
const root = new TreeNode(rootVal);
// 递归构建左子树和右子树
root.left = sortedArrayToBST(nums.slice(0, mid));
root.right = sortedArrayToBST(nums.slice(mid + 1));
return root;
};