leecode刷题 将有序数组转换为二叉搜索树

简介: 给定一个升序排列的整数数组 `nums`,要求将其转换为一棵高度平衡的二叉搜索树(BST)。通过递归方法,选择数组中间元素作为根节点,左半部分构建左子树,右半部分构建右子树。优化后的代码使用索引递归,避免了数组复制操作,提高了效率。

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵平衡二叉搜索树。

示例 1:
image.png

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

示例 2:
image.png

输入:nums = [1,3]
输出:[3,1]
解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。
提示:

1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 按 严格递增 顺序排列

我第一个方案是采用的数组截取的方式


/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
import java.util.Arrays;

class Solution {
   
    public TreeNode sortedArrayToBST(int[] nums) {
   
        if (nums == null)
            return null;
        int mid = (nums.length) / 2;
        TreeNode root = new TreeNode(nums[mid]);
        // left 0,mid-1,right mid+1,nums.lenght-1
        if (mid == 1) {
   
            root.left = new TreeNode(nums[0]);
        } else if (mid >= 2) {
   
            int[] leftnums = Arrays.copyOfRange(nums, 0, mid);

            root.left = sortedArrayToBST(leftnums);
        }
        if (mid == nums.length - 2) {
   
            root.right = new TreeNode(nums[nums.length - 1]);
        } else if (mid < nums.length - 2) {
   
            int[] rightnum = Arrays.copyOfRange(nums, mid + 1, nums.length);

            root.right = sortedArrayToBST(rightnum);
        }

        return root;

    }

}

这个方案AI优化后,认为可以通过索引的方式完成递归,以下为优化后的代码


public class Solution {
   
    public TreeNode sortedArrayToBST(int[] nums) {
   
        if (nums == null || nums.length == 0) {
   
            return null;
        }
        return buildBST(nums, 0, nums.length - 1);
    }

    private TreeNode buildBST(int[] nums, int start, int end) {
   
        if (start > end) {
   
            return null;
        }
        int mid = start + (end - start) / 2;
        TreeNode root = new TreeNode(nums[mid]);
        root.left = buildBST(nums, start, mid - 1);
        root.right = buildBST(nums, mid + 1, end);
        return root;
    }
}
相关文章
|
2月前
|
人工智能 搜索推荐 API
FlashLabs 正式发布 Chroma 1.0 - 全球首个开源、端到端、实时语音到语音 AI 模型 → 支持个性化语音克隆
FlashLabs 发布全球首个开源、端到端、实时语音到语音 AI 模型 Chroma 1.0,支持低延迟(TTFT \x26lt; 150ms)、高保真语音克隆与强对话能力,旨在成为 OpenAI Realtime API 的开源替代方案。
313 3
|
安全 网络安全 网络架构
解释子网为零和全一子网:概念、原理与应用
解释子网为零和全一子网:概念、原理与应用
475 1
|
SQL 安全 数据库
深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
在Web开发领域,Python虽强大灵活,却也面临着SQL注入、XSS与CSRF等安全威胁。本文将剖析这些常见攻击手段,并提供示例代码,展示如何利用参数化查询、HTML转义及CSRF令牌等技术构建坚固防线,确保Python Web应用的安全性。安全之路永无止境,唯有不断改进方能应对挑战。
415 5
|
存储 监控 NoSQL
结合通义千问对CentOS靶机进行入侵排查
本文介绍了一种在Linux系统中记录所有登录用户操作历史的方法,通过在/etc/profile中添加脚本代码,每次用户登录时会自动生成一个包含该用户操作历史的文件。同时,文章还提供了多种查看系统登录记录和日志的方法,如使用last, last -f /var/log/wtmp和cat /var/log/secure | grep 可疑IP等命令,帮助管理员监控系统活动和排查异常行为。此外,通过rpm -Va命令可检查文件完整性,识别可能存在的安全隐患。
|
开发工具 图形学 Android开发
Unity与安卓丨unity报错:SDK Tools version 0.0 < 26.1.1
Unity与安卓丨unity报错:SDK Tools version 0.0 < 26.1.1
|
算法 C#
【年终分享】彩票数据预测算法(一):离散型马尔可夫链模型实现【附C#代码】
原文:【年终分享】彩票数据预测算法(一):离散型马尔可夫链模型实现【附C#代码】 前言:彩票是一个坑,千万不要往里面跳。任何预测彩票的方法都不可能100%,都只能说比你盲目去买要多那么一些机会而已。   已经3个月没写博客了,因为业余时间一直在研究彩票,发现还是有很多乐趣,偶尔买买,娱乐一下。
2820 0
|
机器学习/深度学习 数据建模
数据分享|Eviews用ARIMA、指数曲线趋势模型对中国进出口总额时间序列预测分析
数据分享|Eviews用ARIMA、指数曲线趋势模型对中国进出口总额时间序列预测分析
|
存储 移动开发 前端开发
【Web 前端】H5新特性有哪些?
【4月更文挑战第22天】【Web 前端】H5新特性有哪些?
|
消息中间件 存储 算法
【云计算与大数据技术】数据编码LZSS算法、Snappy压缩库及分布式通信系统的讲解(图文解释 超详细)
【云计算与大数据技术】数据编码LZSS算法、Snappy压缩库及分布式通信系统的讲解(图文解释 超详细)
1024 0
|
Dubbo 网络协议 Cloud Native
分布式之彻底理解RPC
《分布式》系列
1359 1
分布式之彻底理解RPC

热门文章

最新文章