【力扣热题100】—— Day18.将有序数组转换为二叉搜索树

server/2025/1/8 19:16:10/

期末考试完毕,假期学习开始!

                                —— 25.1.7

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

给你一个整数数组 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/2处(向下取整)作为树和每个子树的根节点,而小于数组/列表长度一半的和大于数组/列表长度一半的分别作为左子树和右子树,由二叉搜索树的性质,不断进行递归,最终使得数组/列表为空时停止递归,这样就可以得到由数组/列表转换后的二叉搜索树


Python实现

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:if not nums:return Nonem = len(nums) // 2return TreeNode(nums[m], self.sortedArrayToBST(nums[:m]), self.sortedArrayToBST(nums[m + 1:]))


Java实现

java">/*** 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;*     }* }*/
class Solution {public TreeNode sortedArrayToBST(int[] nums) {return dfs(nums, 0, nums.length);}private TreeNode dfs(int[] nums, int left, int right) {if (left == right) {return null;}int m = (left + right) / 2;return new TreeNode(nums[m], dfs(nums, left, m), dfs(nums, m + 1, right));}
}


注:

① Java中的数组数据结构,在Python中使用列表的数据结构 

② python中递归的遍历,支持列表传参时索引使用 :m m+1:

:m指的是从列表起始位置遍历到m-1的位置,m+1:指的是从m+1的位置遍历到列表尾部,列表遍历时的索引是左闭右开

③ Java由于遍历时不支持数组传参时直接的切片操作,所以我们创建一个private私有权限的递归方法,然后最后将结果传给主函数,由主函数进行返回


http://www.ppmy.cn/server/156861.html

相关文章

CANN 学习——基于香橙派 KunpengPro(1)

异构计算架构CANN&#xff08;Compute Architecture for Neural Networks&#xff09;是昇腾针对AI场景推出的异构计算架构&#xff0c;向上支持多种AI框架&#xff0c;包括MindSpore、PyTorch、TensorFlow等&#xff0c;向下服务AI处理器与编程。 1CANN 总体架构 CANN 软件架…

数据结构:包装类和泛型

目录 一、包装类 1、基本数据类型和对应的包装类 2、装箱和拆箱 3、自动装箱和自动拆箱 二、泛型 1、什么是泛型 2、泛型语法 3、泛型类 4、擦除机制 5、泛型的上界 6、泛型方法 三、通配符 1、什么是通配符 2、通配符上界 3、通配符下界 &#x1f4da…

基于CentOS的Docker + Nginx + Gitee + Jenkins部署总结(进阶)-- 接入钉钉通知功能

前言 在实际项目会出现更多复杂需求&#xff0c;如一个项目多个端&#xff08;admin、h5等&#xff09;、多分支情况&#xff08;dev、其他分支&#xff09;、多接口环境&#xff08;dev/prod/test等&#xff09;、是否需要钉钉通知等个性化功能。 一、 参数化构建配置 在基础…

30天开发操作系统 第 12 天 -- 定时器

前言 定时器(Timer)对于操作系统非常重要。它在原理上却很简单&#xff0c;只是每隔一段时间(比如0.01秒)就发送一个中断信号给CPU。幸亏有了定时器&#xff0c;CPU才不用辛苦地去计量时间。……如果没有定时器会怎么样呢?让我们想象一下吧。 假如CPU看不到定时器而仍想计量时…

密码学复习

目录 密码体系相关概念传统密码替换技术单表替换密码双表替换密码playfair密码多表替换密码维基密亚密码 置换技术栅栏密码列移位密码 对称密码&#xff08;block cipher&#xff09;DES工作模式AES近现代的一些对称密钥Trible-DESIDEAblowfish 对称密码&#xff08;stream cip…

【计算机组成原理课程设计】:实验0 ROM仿真、实验1 验证74L181运算和逻辑功能、实验2 运算器 2、实验 3 跑马灯、实验4 模拟微程序实现指令

下面文件都放在 gitee 中&#xff0c;大家可以自行选择拿取 course_design: 课程设计 - Gitee.comhttps://gitee.com/island0920/course_design/tree/master/%E8%AE%A1%E7%BB%84 前言 -- 如何使用 Multisim 1. 如何使用元器件 2. 常用元器件 VCC 接地 key space &#xf…

若依中Feign调用的具体使用(若依微服务版自身已集成openfeign依赖,并在此基础上定义了自己的注解)

若依中Feign调用具体使用 注意&#xff1a;以下所有步骤实现的前提是需要在启动类上加入注解 EnableRyFeignClients 主要是为开启feign接口扫描 1.创建服务提供者(provider) 导入依赖(我在分析依赖时发现若依本身已经引入openfeign依赖,并在此基础上自定义了自己的EnableRyF…

【微服务】5、服务保护 Sentinel

Sentinel学习内容概述 Sentinel简介与结构 Sentinel是Spring Cloud Alibaba的组件&#xff0c;由阿里巴巴开源&#xff0c;用于服务流量控制和保护。其内部核心库&#xff08;客户端&#xff09;包含限流、熔断等功能&#xff0c;微服务引入该库后只需配置规则。规则配置方式有…