一起学习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;
};
相关推荐
后端AI实验室3 小时前
我把一个生产Bug的排查过程,交给AI处理——20分钟后我关掉了它
java·ai
凉年技术5 小时前
Java 实现企业微信扫码登录
java·企业微信
xlp666hub5 小时前
Leetcode第五题:用C++解决盛最多水的容器问题
linux·c++·leetcode
狂奔小菜鸡6 小时前
Day41 | Java中的锁分类
java·后端·java ee
hooknum6 小时前
学习记录:基于JWT简单实现登录认证功能-demo
java
程序员Terry7 小时前
同事被深拷贝坑了3小时,我教他原型模式的正确打开方式
java·设计模式
NE_STOP7 小时前
MyBatis-缓存与注解式开发
java
码路飞7 小时前
不装 OpenClaw,我用 30 行 Python 搞了个 QQ AI 机器人
java
Re_zero7 小时前
以为用了 try-with-resources 就稳了?这三个底层漏洞让TCP双向通讯直接卡死
java·后端
SimonKing7 小时前
Fiddler抓包完全指南:从安装配置到抓包,一文讲透
java·后端·程序员