一起学习LeetCode热题100道(42/100)

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]为根节点,左子树由左半部分数组构建,右子树由右半部分数组构建的平衡二叉搜索树。返回这个根节点。

javascript 复制代码
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;
};
相关推荐
砚边数影4 分钟前
逻辑回归实战(二):Java + DL4J 实现模型,评估指标(准确率/召回率)计算
java·数据库·算法·机器学习·逻辑回归·金仓数据库
Cher ~4 分钟前
【数据结构】hash表(unordered_map)
java·数据结构·c++·算法·哈希算法
阿西+5 分钟前
工作学习网址
学习
Engineer邓祥浩10 分钟前
设计模式学习(21) 23-19 备忘录模式
学习·设计模式·备忘录模式
zfj32111 分钟前
好书分享:《两周自制脚本语言》-用java实现一个脚本语言
java·开发语言·python·编译原理
索荣荣24 分钟前
Java反射:从入门到实战的终极指南
java·开发语言
Tisfy25 分钟前
LeetCode 3650.边反转的最小路径总成本:Dijkstra算法
算法·leetcode··dijkstra·题解·迪杰斯特拉
Leo6553528 分钟前
easyExcel 的动态列导出把文本转为数值格式,可以进行函数计算
java
鹿角片ljp33 分钟前
力扣136.只出现一次的数字-异或和HashMap
java·数据结构·算法·leetcode
TracyCoder12335 分钟前
LeetCode Hot100(5/100)——11. 盛最多水的容器
算法·leetcode