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;
    }
}
相关文章
|
1月前
|
JSON 监控 API
掌握使用 requests 库发送各种 HTTP 请求和处理 API 响应
本课程全面讲解了使用 Python 的 requests 库进行 API 请求与响应处理,内容涵盖环境搭建、GET 与 POST 请求、参数传递、错误处理、请求头设置及实战项目开发。通过实例教学,学员可掌握基础到高级技巧,并完成天气查询应用等实际项目,适合初学者快速上手网络编程与 API 调用。
363 130
|
2月前
|
机器学习/深度学习 人工智能 PyTorch
GPT为定制AI应用工程师转型第一周学习计划
本计划帮助开发者快速入门AI领域,首周涵盖AI基础理论、Python编程及PyTorch实战。前两天学习机器学习、深度学习与Transformer核心概念,掌握LLM工作原理。第三至四天快速掌握Python语法与Jupyter使用,完成基础编程任务。第五至七天学习PyTorch,动手训练MNIST手写识别模型,理解Tensor操作与神经网络构建。
175 0
|
1月前
|
人工智能 自然语言处理 Java
从 Java 到 AI:三周求职冲刺打卡,步步为营拿 offer
本计划帮助具备Java、.NET、Vue背景的开发者三周内转型为AI应用工程师,专注实战,聚焦模型调用、RAG、Prompt工程等技能,完成多个AI应用项目,打造可用于求职的简历与作品集。
261 9
|
1月前
|
人工智能 前端开发 Java
Java 转 AI 不用慌!3 周求职打卡表,帮你按天推进、高效拿 offer
三周(21天)AI应用工程师转型打卡计划,涵盖Python基础、Prompt工程、实战项目与面试准备,每日明确任务目标,助力系统学习与进度追踪。
291 7
|
9月前
|
Java 开发者 Spring
Java Springboot监听事件和处理事件
通过这些内容的详细介绍和实例解析,希望能帮助您深入理解Spring Boot中的事件机制,并在实际开发中灵活应用,提高系统的可维护性和扩展性。
455 7
|
7月前
|
SQL 数据库 数据安全/隐私保护
Umbraco CMS 一键启动
**Umbraco 项目创建指南**您可以快速搭建并运行一个基于 Umbraco 的网站。
166 7
|
2月前
|
机器学习/深度学习 人工智能 PyTorch
三周内转型AI工程师学习计划
3周AI转型计划:掌握数学、机器学习与深度学习基础,熟练使用Python、PyTorch/TensorFlow。完成2-3个CV/NLP项目,构建GitHub博客,强化LeetCode刷题与模拟面试。每日高效学习9小时,聚焦实战与面试准备,助力快速入行AI。
201 0
|
7月前
|
Web App开发 人工智能
翻译类插件 实现英文文献自由
这是一组提升阅读与学习效率的翻译及语言辅助插件简介,包含:Google 翻译(快速整页翻译)、彩云小译(AI 翻译支持双语对照)、DeepL Translator(高精准度翻译)、Mate Translate(单词翻译带发音例句)和 Readlang Web Reader(生词点击翻译与保存功能)。以上工具各具特色,满足不同场景下的翻译与学习需求。
190 4
|
8月前
|
人工智能 API 开发者
通过宏实现Word接入DeepSeek
本文介绍如何在Microsoft Word中通过宏接入DeepSeek,实现自动化文本处理。首先确保具备Word 2016及以上版本、DeepSeek API密钥和VBA基础。接着,从豆包平台获取API密钥及模型ID,并在Word中启用开发者选项和宏功能。最后,编写VBA宏代码调用DeepSeek API,完成文本分析与处理。
585 0