一起学习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;
};
相关推荐
Diamond技术流5 分钟前
从0开始学习Linux——环境变量详解
linux·服务器·学习·centos·软件安装·环境变量
哎呦没11 分钟前
Spring Boot OA:企业办公自动化的高效路径
java·spring boot·后端
真心喜欢你吖11 分钟前
Spring Boot与MyBatis-Plus的高效集成
java·spring boot·后端·spring·mybatis
2402_8575893616 分钟前
企业办公自动化:Spring Boot OA管理系统开发与实践
java·spring boot·后端
G丶AEOM35 分钟前
JVM逃逸分析机制
java·jvm
无聊写博客39 分钟前
JDK、JRE、JVM的区别
java·开发语言·jvm
message丶小和尚1 小时前
SpringBoot升级全纪录之项目启动
java·spring boot·mybatis
Allen Bright1 小时前
IDEA配置本地maven
java·maven·intellij-idea
总是学不会.1 小时前
【贪心算法】绿洲之旅:最少次数补给探索
java·算法·intellij-idea
就玩一会_1 小时前
谷粒商城-消息队列Rabbitmq
java·rabbitmq·java-rabbitmq·谷粒商城