Leetcode 108. 将有序数组转换为二叉搜索树

力扣(LeetCode) 108: 将有序数组转换为二叉搜索树 - 解法思路 给定一个整数数组nums,其中元素按升序排序,将其转换为高度平衡的二叉搜索树。高度平衡二叉树是指每个节点的两个子树的深度差不超过 1 的二叉树。关键洞察是在每一步使用中间元素作为根节点。BST 属性:左 < 根 < 右(因为数组已排序)高度平衡:左右子树大小相似最优结构:给定节点数的最小高度为了获得最佳性能,使用带索引的辅助函数方法而不是数组切片。 阅读详情

题目

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

在这里插入图片描述

解答

解法一:递归

递归比较好理解。

步骤如下:

  1. 取区间的中点作为根节点。
  2. 构造左子树 。
  3. 构造右子树。
代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return sortedArrayToBST(nums, 0, nums.length - 1);
    }
    
    private TreeNode sortedArrayToBST(int[] nums, int start, int end) {
        if(start > end) return null;
        
        int mid = (start + end) >>> 1;
        TreeNode node = new TreeNode(nums[mid]);
        
        node.left = sortedArrayToBST(nums, start, mid - 1);
        node.right = sortedArrayToBST(nums, mid + 1, end);
        
        return node;
    }
}
结果

在这里插入图片描述

解法二:队列 + BFS

Entry 类解释:

  1. root 表示:区间 [start, end] 生成的树的根节点。
  2. start 表示:区间左边界。
  3. end 表示:区间有边界。

流程如下:

  1. 通过层序的方式。每一个结点赋值过后会创建左右子树的根节点并建立好联系。
  2. 然后将其左右子树的根节点与其相对应的区间范围封装成一个 Entry 放入队列。
  3. 不断从队列中取出 Entry 处理。

通过这种方式可以在创建结点时,顺便赋值了。

代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    
    class Entry {
        TreeNode root;
        int start;
        int end;
        
        Entry(TreeNode root, int start, int end) {
            this.root = root;
            this.start = start;
            this.end = end;
        }
    }
    
    public TreeNode sortedArrayToBST(int[] nums) {
        if(nums == null || nums.length == 0) return null; 
        
        LinkedList<Entry> queue = new LinkedList<>();
        Entry rootEntry = new Entry(new TreeNode(0), 0, nums.length - 1);
        queue.offer(rootEntry);
        while(!queue.isEmpty()) {
            Entry entry = queue.poll();
            int start = entry.start;
            int end = entry.end;
            int mid = (start + end) >>> 1;
            TreeNode curRoot = entry.root;
            curRoot.val = nums[mid];
            
            if(start <= mid - 1) {
                curRoot.left = new TreeNode(0);
                queue.offer(new Entry(curRoot.left, start, mid - 1));
            }
            
            if(mid + 1 <= end) {
                curRoot.right = new TreeNode(0);
                queue.offer(new Entry(curRoot.right, mid + 1, end));
            }
        }
        
        return rootEntry.root;
    }
}
结果

在这里插入图片描述

【简单】力扣算法题解析LeetCode108:将有序数组转换为二叉搜索树 题目要求将升序数组转换为平衡二叉搜索树。核心思路是利用二分法递归构建:每次选择中间元素作为根节点,左子树由左侧子数组构建,右子树由右侧子数组构建,确保左右子树高度差≤1。Java实现通过递归函数处理子数组范围,时间复杂度O(n),空间复杂度O(log n)。示例验证了算法的正确性,如输入[-10,-3,0,5,9]可输出[0,-3,9,-10,null,5]。代码简洁高效,符合平衡二叉搜索树的性质要求。 阅读详情

相关推荐

ENVI SARscape安装全攻略:从下载到汉化一步到位(附最新试用申请链接)

本文提供ENVI SARscape从下载安装到汉化的完整指南,特别针对InSAR(合成孔径雷达干涉测量)分析环境搭建。详细介绍了系统要求、分步安装流程、汉化优化方法及硬件加速配置,并分享数据处理验证和常见问题解决方案,帮助用户高效搭建遥感数据分析平台。

rnn9storyteller的博客 1404

Leetcode刷题java之108. 将有序数组转换为二叉搜索树

执行结果: 通过 显示详情 执行用时 :2 ms, 在所有 Java 提交中击败了78.64% 的用户 内存消耗 :38.3 MB, 在所有 Java 提交中击败了47.48%的用户 题目: 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 示例: 给定有序数组: [-10,...

逆水行舟,不进则退 1098

生态位宽度计算&可视化展示(R语言)

物种的生态位越宽,该物种的特化程度就越小,倾向于泛化种(generalist species);物种的生态位越窄,倾向于是一个特化种(specialists species)。生态位宽度是指物种(或其它生物单位)在群落中所利用的各种不同资源的总和。本篇所使用为生态位宽度指数即**Levins的生态位宽度指数。

weixin_53705272的博客 4434

LeetCode108 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...

CourageKang的博客 840

基于单片机红外线遥控Proteus仿真电路发射接收

*单片机设计介绍,基于单片机红外线遥控Proteus仿真电路发射接收。

2201_75940997的博客 3942

Kali Linux渗透测试:蚁剑(AntSword)三种安装方法与避坑指南

WebShell管理是渗透测试与网络安全攻防演练中的关键技术环节,它允许安全人员在获得初步访问权限后,对目标系统进行文件管理、命令执行和数据库操作等深度控制。其核心原理是通过在Web服务器上植入特定脚本,建立一条隐蔽的远程管理通道。在实战中,一个高效、稳定的WebShell管理工具能极大提升后渗透阶段的工作效率与成功率。蚁剑(AntSword)作为一款功能强大的国产开源工具,凭借其插件化架构和图形化界面,成为众多安全研究人员的首选。本文将聚焦于如何在渗透测试专用操作系统Kali Linux上部署蚁剑,详细对

weixin_34413103的博客 413

Leetcode108. 有序数组转为二叉树

Time: 20190901 Type: Easy 题目描述 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 示例: 给定有序数组: [-10,-3,0,5,9], 一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 /...

Bing's Blog 697

华为iTrustee实战:5分钟搞定TrustZone环境搭建(附BoostKit配置技巧)

本文提供了一份华为iTrustee与ARM TrustZone环境的5分钟快速搭建实战指南。详细介绍了在TaiShan服务器上利用鲲鹏BoostKit套件部署可信执行环境(TEE)的完整流程,包括环境检查、驱动安装、首个可信应用(TA)的编译与运行,并分享了关键的BoostKit配置技巧与深度排错方法,助力开发者快速为业务注入硬件级安全能力。

yoga7的博客 966

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。 示例: 给定有序数组: [-10,-3,0,5,9], 一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -...

luxuiary的博客 366

【红外DDE算法】一种应用于高动态范围红外可视化的算法

【红外DDE算法】一种应用于高动态范围红外可视化的算法 - 这个算法背后的动机 - 展示这个算法的流程 - 然后讨论各个可调参数的意义。

sunwindl91181的博客 1682

单智能体篇:Prompt工程艺术

模型在接收到 Prompt 时会自动扮演“角色”,角色定义的好坏直接影响智能体输出的风格和专业性。角色定义的重要性让智能体具备明确身份,例如“你是一位专业理财顾问”或“你是一个幽默的文案创作助手”。角色限定了模型知识输出的范围,使回答更专业、更贴合预期。实战示例模糊Prompt给我一些投资建议。你可以投资股票或者基金。优化Prompt你是一位具有10年经验的专业理财顾问,请给我针对30岁男性,年收入20万,风险偏中等的投资组合建议。

公众号:AI前沿侦探 1301

leetcode108将有序数组转换为二叉搜索树(将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1)

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 示例: 给定有序数组: [-10,-3,0,5,9], 一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:   思路: 构造一棵树的过程可以拆分成无数个这样的子问题:构造树的每个节点以及节点之间的关系。 对于每个节点来说,都需要: 选取节点 构造该节点的左子树 构造该节点的右子树 因题目要求构造一

Miriwas 286

Spark Sql 连接mysql

转载请务必注明原创地址为:http://dongkelun.com/2018/03/21/sparkMysql/ 1、基本概念和用法(摘自spark官方文档中文版) Spark SQL 还有一个能够使用 JDBC 从其他数据库读取数据的数据源。当使用 JDBC 访问其它数据库时,应该首选 JdbcRDD。这是因为结果是以数据框(DataFrame)返回的,且这样 Spark SQL操作轻松或便......

主要分享大数据相关的知识,如Spark、Hudi 1万+

【每日力扣Leetcode】108-将有序数组转换为二叉搜索树

力扣题库108,将有序数组转换为二叉搜索树。 题目链接点这里。 文章目录题目描述解题思路初始答案改进答案注意事项 题目描述 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 示例: 给定有序数组: [-10,-3,0,5,9], 一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -1

T型人小付的博客 331

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LeetCode 力扣 108. 将有序数组转换为二叉搜索树

题目描述(简单难度) 给一个升序数组,生成一个平衡二叉搜索树。平衡二叉树定义如下: 它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 二叉搜索树定义如下: 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值; 任意节点的左、右子树也分别为二叉查找树; 没有键值...

wind_liang的博客 1389

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

LeetCode第108题_将有序数组转换为二叉搜索树

给你一个整数数组nums,其中元素已经按排列,请你将其转换为一棵二叉搜索树。二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

qq_40263592的博客 1535

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

108. 将有序数组转换为二叉搜索树【 力扣(LeetCode) 】

摘要: 题目要求将升序排列的整数数组转换为平衡二叉搜索树(BST)。平衡BST的左右子树高度差不超过1,且中序遍历结果为有序序列。解题思路是采用二分法,每次选取数组中间元素作为根节点,递归构建左右子树。具体实现通过辅助函数BuildNode确定子数组中心位置,创建节点并递归处理左右子数组。时间复杂度为O(n),空间复杂度为O(log n)。示例代码展示了如何通过递归分治实现这一过程。 (字数:150)

yyh520025的博客 908

力扣108. 将有序数组转换为二叉搜索树(中序遍历,递归)

力扣108. 将有序数组转换为二叉搜索树(中序遍历,递归) https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/ 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。 示例: 给定有序数组...

小麦China的博客 582

力扣leetcode 108. 将有序数组转换为二叉搜索树 java

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { publ...

izhxxx的博客 357

leetcode刷题记录(七十四)——108. 将有序数组转换为二叉搜索树

108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)108. 将有序数组转换为二叉搜索树 - 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。

weixin_45994787的博客 1145

LeetCode.108 将有序数组转换为二叉搜索树

LeetCode.108 将有序数组转换为二叉搜索树,递归解法

weixin_43599456的博客 347

108.力扣LeetCode_将有序数组转换为二叉搜索树

这段代码实现了一个将有序数组转换为平衡二叉搜索树的算法。通过递归方法,每次选取数组中间元素作为当前子树的根节点,左半部分构建左子树,右半部分构建右子树。这样保证了生成的二叉搜索树既是平衡的(左右子树高度差不超过1),又满足二叉搜索树的性质(左子树所有值小于根节点,右子树所有值大于根节点)。

2401_82472941的博客 128

算法学习——LeetCode力扣二叉树篇8(669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树 )

算法学习——LeetCode力扣二叉树篇8(669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树 )

拉依达不拉跨的博客 1218

【LeetCode108.将有序数组转换为二叉搜索树】vs. 【将二叉搜索树转换为有序数组】

由于二叉搜索树对于任意一个节点来说,左孩子小于父亲节点,右孩子大于父亲节点,因此可以直接通过中序遍历,得到升序数组。

qq_52114254的博客 369

leetcode 108 递归-二分 有序数组转换为二叉搜索树

leetcode 108 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} ...

qq_35299223的博客 195

LeetCode108-将有序数组转换为二叉搜索树

总是有朋友跟我说:我总是拿美女图片做封面 怀疑我有些流氓 我郑重声明:我就是想吸引流量而已 写篇文章不容易啊哈哈哈哈哈哈哈 瞧,我现在不就换了一张图片了吗? 108-将有序数组转换为二叉搜索树 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。 示例: 给定有序数组: [-1...

飞奔的菜猪的博客 275
上一篇: Leetcode 107. 二叉树的层次遍历 II
下一篇: Leetcode 110. 平衡二叉树
一纸浮萍
博客等级 码龄9年 11粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值