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月前
|
JSON 监控 API
掌握使用 requests 库发送各种 HTTP 请求和处理 API 响应
本课程全面讲解了使用 Python 的 requests 库进行 API 请求与响应处理,内容涵盖环境搭建、GET 与 POST 请求、参数传递、错误处理、请求头设置及实战项目开发。通过实例教学,学员可掌握基础到高级技巧,并完成天气查询应用等实际项目,适合初学者快速上手网络编程与 API 调用。
453 130
|
3月前
|
机器学习/深度学习 存储 JSON
PyCharm 创建了第一个项目
在 PyCharm 中创建项目时,合理的目录结构有助于代码、依赖和资源的高效管理。本文详细解析了 PyCharm 的默认目录结构,如 `.idea/`(配置文件)、`venv/`(虚拟环境)、`src/`(源代码)、`tests/`(测试代码)、`data/`(数据文件)等,并提供了文件创建建议和最佳实践。同时介绍了核心代码、脚本文件、测试文件的存放位置,以及 PyCharm 的常用操作技巧,帮助开发者构建清晰、可维护的项目结构。
217 2
|
3月前
|
机器学习/深度学习 人工智能 PyTorch
GPT为定制AI应用工程师转型第一周学习计划
本计划帮助开发者快速入门AI领域,首周涵盖AI基础理论、Python编程及PyTorch实战。前两天学习机器学习、深度学习与Transformer核心概念,掌握LLM工作原理。第三至四天快速掌握Python语法与Jupyter使用,完成基础编程任务。第五至七天学习PyTorch,动手训练MNIST手写识别模型,理解Tensor操作与神经网络构建。
210 0
|
2月前
|
人工智能 自然语言处理 Java
从 Java 到 AI:三周求职冲刺打卡,步步为营拿 offer
本计划帮助具备Java、.NET、Vue背景的开发者三周内转型为AI应用工程师,专注实战,聚焦模型调用、RAG、Prompt工程等技能,完成多个AI应用项目,打造可用于求职的简历与作品集。
292 9
|
2月前
|
人工智能 前端开发 Java
Java 转 AI 不用慌!3 周求职打卡表,帮你按天推进、高效拿 offer
三周(21天)AI应用工程师转型打卡计划,涵盖Python基础、Prompt工程、实战项目与面试准备,每日明确任务目标,助力系统学习与进度追踪。
342 7
|
10月前
|
Java 开发者 Spring
Java Springboot监听事件和处理事件
通过这些内容的详细介绍和实例解析,希望能帮助您深入理解Spring Boot中的事件机制,并在实际开发中灵活应用,提高系统的可维护性和扩展性。
545 7
|
3月前
|
缓存 JSON 数据库
检验你的fastapi掌握了吗
本内容系统讲解了 FastAPI 的核心功能与高级应用,包括路径参数定义、类型验证、Pydantic 模型、依赖注入、异步处理、权限校验、CORS 配置、错误处理、文档生成及性能优化等内容,适用于构建高效、可维护的现代 Web API 服务。
141 7
|
3月前
|
Shell 网络安全 开发工具
项目快速导入git
本文介绍了如何在本地初始化 Git 仓库并将代码提交到远程仓库(如 GitHub 或 Gitee)的基本流程。内容包括安装 Git、创建仓库、添加文件、提交更改以及推送代码到远程仓库的详细步骤,适合初学者快速掌握 Git 的基本使用方法。
167 1
|
8月前
|
SQL 数据库 数据安全/隐私保护
Umbraco CMS 一键启动
**Umbraco 项目创建指南**您可以快速搭建并运行一个基于 Umbraco 的网站。
203 7