一起学习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;
};
相关推荐
鲸沉梦落11 小时前
Java中的Stream
java
yihuiComeOn11 小时前
[源码系列:手写Spring] AOP第二节:JDK动态代理 - 当AOP遇见动态代理的浪漫邂逅
java·后端·spring
leoufung12 小时前
LeetCode 92 反转链表 II 全流程详解
算法·leetcode·链表
Porunarufu12 小时前
Java·关于List
java·开发语言
靠沿12 小时前
Java数据结构初阶——Collection、List的介绍与ArrayList
java·数据结构·list
程序猿小蒜12 小时前
基于springboot的的学生干部管理系统开发与设计
java·前端·spring boot·后端·spring
q***563812 小时前
Spring容器初始化扩展点:ApplicationContextInitializer
java·后端·spring
ndjnddjxn12 小时前
Rust学习
开发语言·学习·rust
q***518913 小时前
SpringCloud系列教程:微服务的未来(十四)网关登录校验、自定义过滤器GlobalFilter、GatawayFilter
java·spring cloud·微服务
go__Ahead13 小时前
【Java】线程池源码解析
java·juc