当前位置: 首页 > news >正文

数据结构与算法之二叉树: LeetCode 108. 将有序数组转换为二叉搜索树 (Ts版)

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

  • https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/

描述

  • 给你一个整数数组 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 <= 1 0 4 10^4 104
  • - 1 0 4 10^4 104 <= nums[i] <= 1 0 4 10^4 104
  • nums 按 严格递增 顺序排列

Typescript 版算法实现


1 ) 方案1: 中序遍历,总是选择中间位置左边的数字作为根节点

/*** Definition for a binary tree node.* class TreeNode {*     val: number*     left: TreeNode | null*     right: TreeNode | null*     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {*         this.val = (val===undefined ? 0 : val)*         this.left = (left===undefined ? null : left)*         this.right = (right===undefined ? null : right)*     }* }*/function sortedArrayToBST(nums: number[]): TreeNode | null {return helper(nums, 0, nums.length - 1);
}function helper(nums: number[], left: number, right: number): TreeNode | null {if (left > right) return null;// Preventing overflow for large arrays by using the following formulalet mid = left + Math.floor((right - left) / 2);let root = new TreeNode(nums[mid]);root.left = helper(nums, left, mid - 1);root.right = helper(nums, mid + 1, right);return root;
}

2 ) 方案2: 中序遍历,总是选择中间位置右边的数字作为根节点

/*** Definition for a binary tree node.* class TreeNode {*     val: number*     left: TreeNode | null*     right: TreeNode | null*     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {*         this.val = (val===undefined ? 0 : val)*         this.left = (left===undefined ? null : left)*         this.right = (right===undefined ? null : right)*     }* }*/function sortedArrayToBST(nums: number[]): TreeNode | null {return helper(nums, 0, nums.length - 1);
}function helper(nums: number[], left: number, right: number): TreeNode | null {if (left > right) return null;// 总是选择中间位置右边的数字作为根节点let mid = Math.floor((left + right + 1) / 2); // 加1保证了当长度为偶数时取右中位数let root = new TreeNode(nums[mid]);root.left = helper(nums, left, mid - 1);root.right = helper(nums, mid + 1, right);return root;
}

3 ) 方案3: 中序遍历,选择任意一个中间位置数字作为根节点

/*** Definition for a binary tree node.* class TreeNode {*     val: number*     left: TreeNode | null*     right: TreeNode | null*     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {*         this.val = (val===undefined ? 0 : val)*         this.left = (left===undefined ? null : left)*         this.right = (right===undefined ? null : right)*     }* }*/function sortedArrayToBST(nums: number[]): TreeNode | null {return helper(0, nums.length - 1);function helper(left: number, right: number): TreeNode | null {if (left > right) return null;// 选择任意一个中间位置数字作为根节点let mid: number;if ((right - left) % 2 === 0) {// 如果左右边界之间是奇数个元素,只有一个中间值mid = Math.floor((left + right) / 2);} else {// 如果左右边界之间是偶数个元素,随机选择一个中间值mid = left + Math.floor((right - left + Math.random()) / 2);}const root = new TreeNode(nums[mid]);root.left = helper(left, mid - 1);root.right = helper(mid + 1, right);return root;}
}

4 ) 方案4: 简单版本

/*** Definition for a binary tree node.* class TreeNode {*     val: number*     left: TreeNode | null*     right: TreeNode | null*     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {*         this.val = (val===undefined ? 0 : val)*         this.left = (left===undefined ? null : left)*         this.right = (right===undefined ? null : right)*     }* }*/function sortedArrayToBST(nums: number[]): TreeNode | null {if(!nums.length) return null// 二叉搜索树的中序遍历,就是升序列表// 数组中间的位置,可以作为树的根节点const mid = Math.floor(nums.length / 2)const root = new TreeNode(nums[mid])root.left = sortedArrayToBST(nums.slice(0,mid))root.right = sortedArrayToBST(nums.slice(mid+1))return root
}

相关文章:

数据结构与算法之二叉树: LeetCode 108. 将有序数组转换为二叉搜索树 (Ts版)

将有序数组转换为二叉搜索树 https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/ 描述 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列请你将其转换为一棵 平衡 二叉搜索树 示例 1 输入&#xff1a;nums [-10,-3,0,5,9…...

Java 多线程之@Async

SpringBoot 中使用 Async 使用 Async 注解步骤&#xff1a; 添加 EnableAsync 注解。在主类上或者 某个类上&#xff0c;否则&#xff0c;异步方法不会生效 添加 Async注解。在异步方法上添加此注解。异步方法不能被 static 修饰需要自定义线程池&#xff0c;则可以配置线程池…...

代码随想录day38 动态规划6

题目&#xff1a;322.零钱兑换 279.完全平方数 139.单词拆分 多重背包 背包总结 需要重做&#xff1a;322&#xff0c;139 322. 零钱兑换 思路&#xff1a;零钱&#xff0c;可取多次-》完全背包。 注意&#xff1a; 五部&#xff1a; 1.dp[j]:价值为j的时候&#xff0c;最…...

LabVIEW无标题的模态VI窗口的白框怎么去除?

在LabVIEW中&#xff0c;如果你遇到无标题的模态&#xff08;modal&#xff09;VI窗口显示有一个白框&#xff0c;通常是由于VI界面的一些属性或者控件设置问题导致的。为了去除这个白框&#xff0c;可以尝试以下几种方法&#xff1a; 1. 检查VI窗口属性设置 确保你的VI窗口属…...

iOS - 原子操作

在 Objective-C 运行时中&#xff0c;原子操作主要通过以下几种方式实现&#xff1a; 1. 基本原子操作 // 原子操作的基本实现 #if __has_feature(c_atomic)#define OSAtomicIncrement32(p) __c11_atomic_add((_Atomic(int32_t) *)(p), 1, __ATOMIC_RELAXED) #define …...

Go语言的语法

Go语言入门与实战 引言 在当今的开发环境中&#xff0c;随着互联网的快速发展&#xff0c;程序员们面临着越来越复杂的系统需求。针对这些需求&#xff0c;Go语言&#xff08;又称Golang&#xff09;作为一种新的编程语言应运而生。Go语言由Google开发&#xff0c;它具有简单…...

【MySQL 保姆级教学】用户管理和数据库权限(16)

数据库账户管理是指对数据库用户进行创建、修改和删除等操作&#xff0c;以控制用户对数据库的访问权限。通过账户管理&#xff0c;可以设置用户名、密码、主机地址等信息&#xff0c;确保数据库的安全性和可控性。例如&#xff0c;使用 CREATE USER 创建用户&#xff0c;ALTER…...

什么是 ES6 “模板语法” ?

ES6 提出了“模板语法”的概念。在 ES6 以前&#xff0c;拼接字符串是很麻烦的事情 var name css var career coder! var hobby [coding ,"writing] var finalString my name is name &#xff0c;I work as a career I love hobby[0] and hobby[1]仅仅几…...

[项目实战2]贪吃蛇游戏

目录 贪吃蛇游戏&#xff1a;&#xff1a; 一、游戏效果及功能实现&#xff1a; 1.规则 ​​​​​​​ ​​​​​​​ ​​​​​​​ 2.基本功能实现 ​​​​​​​ ​​​​​​​ ​​​​​​​ 3.技术要点 ​​​​​​​…...

关于FPGA中添加FIR IP核(采用了GOWIN EDA)

文章目录 前言一、IP核二、MATLAB文件三、导出系数COE文件1.设计滤波器2.用官方的matlab代码或者直接用文本文件 四、进行模块化设计源文件 前言 FIR滤波器的特点是其输出信号是输入信号的加权和&#xff0c;权值由滤波器的系数决定。每个系数代表了滤波器在特定延迟位置上的“…...

1. 使用springboot做一个音乐播放器软件项目【前期规划】

背景&#xff1a; 现在大部分音乐软件都是要冲会员才可以无限常听的。对于喜欢听音乐的小伙伴&#xff0c;资金又比较紧张&#xff0c;是那么的不友好。作为程序员的我&#xff0c;也是喜欢听着歌&#xff0c;敲着代码。 最近就想做一个音乐播放器的软件&#xff0c;在内网中使…...

【Dify】Dify自定义模型设置 | 对接DMXAPI使用打折 Openai GPT 或 Claude3.5系列模型方法详解

一、Dify & DMXAPI 1、Dify DIFY&#xff08;Do It For You&#xff09;是一种自动化工具或服务&#xff0c;旨在帮助用户简化操作&#xff0c;减少繁琐的手动操作&#xff0c;提升工作效率。通过DIFY&#xff0c;用户能够快速完成任务、获取所需数据&#xff0c;并且可以…...

【Rust自学】10.8. 生命周期 Pt.4:方法定义中的生命周期标注与静态生命周期

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 10.8.1. 方法定义中的生命周期标注 还记得在上一篇文章 10.7. 生命周期 Pt.3 中所提到的省略生命周期的三条规则吗&#xff1a; 规则1&…...

121 买入股票的最佳时机

思路1&#xff1a; 买的那天一定是卖的那天之前的最小值。 每到一天&#xff0c;维护那天之前的最小值即可。 假设第一天是最小值&#xff0c;最大值初始化为0&#xff0c;当以后某天的价格小于最小值时&#xff0c;将最小值更新 当天价格大于最小值&#xff0c;说明有利可图…...

PID学习资料

TI公司的CONTROLSUITE https://www.ti.com.cn/tool/cn/CONTROLSUITE学点PID专栏-小麦大叔PID控制器算法系列TI公开培训(中文字幕) 电机控制&#xff0c;PI控制器&#xff0c;PID控制器和现场定向控制 书籍&#xff1a; Advanced PID Control先进PID控制及其MATLAB仿真Practic…...

采用标准化的方式开展设计-研发中运用设计模式

概述 实现规范化、标准化的引导式设计&#xff0c;以业务需求为输入&#xff0c;识别业务特点&#xff0c;并通过引导式设计&#xff0c;找到最适合的设计模式、具体方案&#xff0c;汇总成为应用的设计&#xff0c;拉齐各应用的设计一的致性。 采用标准化的方式开展设计…...

【Linux系列】并发与顺序执行:在 Linux 脚本中的应用与选择

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

Scala语言的数据库交互

Scala语言的数据库交互 引言 在当今互联网应用的开发中&#xff0c;数据库几乎是每一个应用程序中不可或缺的一部分。选择合适的编程语言和工具与数据库进行交互&#xff0c;对于提升开发效率和应用性能至关重要。Scala作为一种现代的多范式编程语言&#xff0c;结合了面向对…...

字节青训十五题-Java-数字字符串格式化

问题 问题描述 小M在工作时遇到了一个问题&#xff0c;他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式&#xff0c;并且保留小数部分。小M还发现&#xff0c;有时候输入的数字字符串前面会有无用的 0&#xff0c;这些也需要精简掉。请你帮助小M编写程…...

搭建一个本地轻量级且好用的学习TypeScript语言的环境

需求说明 虽然 TypeScript 的在线 Playground 很方便 https://www.tslang.com.cn/play/&#xff0c;但毕竟是在浏览器中使用&#xff0c;没有本地的 IDE 那么顺手。所以我想搭建一个本地类似 Playground 的环境&#xff0c;这样在学习 TypeScript 的过程中&#xff0c;可以更方…...

SiameseUIE基础教程:从SSH登录到实体输出的完整流程详解

SiameseUIE基础教程&#xff1a;从SSH登录到实体输出的完整流程详解 1. 引言&#xff1a;信息抽取的便捷解决方案 信息抽取是自然语言处理中的核心任务之一&#xff0c;能够从非结构化文本中自动识别和提取关键信息。传统的信息抽取方案往往需要复杂的环境配置和大量的依赖安…...

CHORD-X系统在复杂操作系统环境下的兼容性部署方案

CHORD-X系统在复杂操作系统环境下的兼容性部署方案 部署一套AI系统&#xff0c;最让人头疼的往往不是模型本身&#xff0c;而是它能不能在你手头的电脑或服务器上顺利跑起来。尤其是当你的工作环境里混杂着Windows、各种Linux发行版&#xff0c;甚至还有国产化操作系统时&…...

Phi-4-mini-reasoning Chainlit插件开发:集成Copilot式代码补全与执行沙箱

Phi-4-mini-reasoning Chainlit插件开发&#xff1a;集成Copilot式代码补全与执行沙箱 1. 项目概述 Phi-4-mini-reasoning是一个基于合成数据构建的轻量级开源模型&#xff0c;专注于高质量、密集推理的数据处理。作为Phi-4模型家族的一员&#xff0c;它特别强化了数学推理能…...

Intv_AI_MK11 C++高性能计算集成指南:模型推理加速实践

Intv_AI_MK11 C高性能计算集成指南&#xff1a;模型推理加速实践 1. 为什么C开发者需要关注AI推理加速 在当今AI应用遍地开花的时代&#xff0c;C仍然是高性能计算领域的王者语言。当我们需要将AI模型集成到对延迟和吞吐量极其敏感的系统时——比如高频交易引擎、实时视频分析…...

PyCharm专业开发:调试与集成千问3.5-9B模型调用代码

PyCharm专业开发&#xff1a;调试与集成千问3.5-9B模型调用代码 1. 前言&#xff1a;为什么选择PyCharm进行AI模型开发 PyCharm作为Python开发者最喜爱的IDE之一&#xff0c;在AI模型开发领域有着独特的优势。特别是当我们需要集成像千问3.5-9B这样的大语言模型时&#xff0c…...

STM32F103C8T6驱动DHT11温湿度传感器,从CubeMX配置到OLED显示(附完整工程)

STM32F103C8T6驱动DHT11温湿度传感器全流程实战指南 最近在帮几个学生调试毕业设计时&#xff0c;发现很多初学者在使用STM32驱动DHT11传感器时总会遇到各种奇怪的问题。要么时序不对导致数据读取失败&#xff0c;要么OLED显示乱码&#xff0c;最头疼的是CubeMX配置一堆参数后代…...

ChatGLM-6B企业落地:建筑行业BIM文档智能问答与规范条款检索

ChatGLM-6B企业落地&#xff1a;建筑行业BIM文档智能问答与规范条款检索 1. 引言&#xff1a;建筑行业的文档之痛 如果你在建筑行业工作过&#xff0c;一定对下面这个场景不陌生&#xff1a;为了找一个具体的施工规范条款&#xff0c;你需要翻遍几十个PDF文档&#xff0c;每个…...

Matlab r2023b Simulink 子系统封面自定义指南

1. 为什么需要自定义Simulink子系统封面&#xff1f; 作为一个从零开始学习Matlab Simulink的新手&#xff0c;我最初完全不明白为什么要在子系统上加封面。直到参与了一个机器人控制系统的团队项目&#xff0c;才深刻体会到这个功能的价值。想象一下&#xff0c;当你打开一个包…...

RAdam实战教程:如何在PyTorch中轻松集成和使用Rectified Adam优化器

RAdam实战教程&#xff1a;如何在PyTorch中轻松集成和使用Rectified Adam优化器 【免费下载链接】RAdam On the Variance of the Adaptive Learning Rate and Beyond 项目地址: https://gitcode.com/gh_mirrors/ra/RAdam Rectified Adam&#xff08;RAdam&#xff09;是…...

DSI3协议实战入门:从理论到波形调试的完整指南

1. DSI3协议基础&#xff1a;从电线对话开始理解 第一次接触DSI3协议时&#xff0c;我盯着那根细细的通信线看了半天——就这么一根线&#xff0c;怎么实现主设备和多个从设备之间的数据交换&#xff1f;后来才发现&#xff0c;这根线里的门道比我想象的精彩多了。DSI3&#xf…...