【Python刷题】将有序数组转换为二叉搜索树

问题描述

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵
平衡 二叉搜索树。

高度平衡的意思是:二叉树是一颗满足“每个结点的左右两个子树的高度差的绝对值不超过1”的二叉树。

示例 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] 都是高度平衡二叉搜索树。

解决办法

因为是平衡二叉树,所以总是要选取中间节点,比如在示例一中[-10,-3,0,5,9],先选取中间节点0,然后再分别同时选取两边数字的左侧[-10,5]或者右侧[-3,9]节点 。

  • 中序遍历,总是选择中间位置左边的数字作为根节点
  • 中间位置左边的数字作为根节点,则根节点的下标为mid=(left+right)//2
    具体实现步骤:
  • 对数组的下标进行遍历,首先排除特殊情况,定义左右边界下标,如果左边的索引大于右边的索引,则返回None
  • 第二个特殊情况,如果左右数的索引相等,那么说明只有一个根结点,则建立一个只有根结点的树
  • 排除掉这两中情况后,选取中间节点,即mid=[l+r]//2,将其设置为根结点
  • 再分别采用递归的方法设置左子树和右子树

代码示例

class Solution:def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:def arrayToBst(l,r):if l > r:return Noneif l == r:return TreeNode(nums[l],None,None)  #建立一棵树,左、右子树都为空else:mid = ( l + r ) // 2root=TreeNode(nums[mid])root.left = arrayToBst(l,mid-1)root.right = arrayToBst(mid+1,r)return rootreturn arrayToBst(0,len(nums)-1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/785843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java学习33-Java 多线程Thread 多线程安全问题

Thread的生命周期 JDK1.5之前 JDK1.5之后分为 NEW RUNNABLE BLOCKED WAITING TIMED_WAITING TERMINATED 多线程安全问题 举例,要求三个窗口同时卖票,总共有100张票,打印出卖票过程,不允许重复售卖 package Thread;public class …

Codeforces Round 930 (Div. 2) C. Bitwise Operation Wizard

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e9, maxm 4e4 5; co…

linux:生产者消费者模型

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 前言一、生产者消费者模型二、基于阻塞队列的生产者消费者模型代码实现 总结 前言 本文是对于生产者消费者模型的知识总结 一、生产者消费者模型 生产者消费者模型就是…

OpenHarmony实战开发-如何实现购物示例应用

​介绍 本示例展示在进场时加载进场动画&#xff0c;整体使用Tabs容器设计应用框架&#xff0c;通过TabContent组件设置分页面&#xff0c;在子页面中绘制界面。通过Navigation完成页面之间的切换。在详情页中通过 Video组件加载视频资源&#xff0c;使用CustomDialogControll…

Python 代码混淆工具概述

在保护Python代码安全方面&#xff0c;有多种混淆工具可供选择&#xff0c;包括 Cython, Nuitka, Pyminifier 和 IPA guard。本文将介绍这些工具的特点和适用情况&#xff0c;以及在实际应用中的注意事项。 &#x1f4dd; 摘要 本文探讨了几种常见的 Python 代码混淆工具&am…

用Typora+picgo+cloudflare+Telegraph-image的免费,无需服务器,无限空间的图床搭建(避坑指南)

用TyporapicgocloudflareTelegraph-image的免费&#xff0c;无需服务器&#xff0c;无限空间的图床搭建&#xff08;避坑指南&#xff09; 前提&#xff1a;有github何cloudflare (没有的话注册也很快) 首先&#xff0c;是一个别人写的详细的配置流程&#xff0c;傻瓜式教程&am…

【微机原理实战笔记】浅入理解汇编源文件

记录在学习微机原理时候的知识点&#xff0c;以便温故而知新。 Rd&#xff1a;目的操作数的寄存器 Rn、Rm&#xff1a;代指源操作数的寄存器 #num&#xff1a;代指立即数 label&#xff1a;代指标号 浅入理解汇编源文件 汇编源文件代码结构文件类型堆栈对齐与指示编译器 输出、…

嵌入式网络硬件方案

一. 简介 本文来了解一下嵌入式有些网络中&#xff0c;涉及的网络硬件方案。 注意&#xff1a;本文说明的是有些网络。 提起网络&#xff0c;我们一般想到的硬件就是“网卡”&#xff0c;“网卡”这个概念最早从电脑领域传出来&#xff0c;顾名思义就是能上网的卡。在电脑领…

Android12 简单的共享内存驱动实现 参考Ashmem

Android12 共享内存驱动实现 SOC&#xff1a;RK3568 system&#xff1a;Android12 概述&#xff1a; 1. 概述 Ashmem&#xff08;Anonymous Shared Memory&#xff0c;Android 匿名共享内存&#xff09;&#xff0c;它基于 mmap 系统调用&#xff0c;可以让不同进程将同一段…

Android invalidate、postInvalidate、requestLayout的区别

一、方法介绍 1、invalidate(): invalidate方法用于在UI线程中请求重绘视图。当我们希望在主线程中更新UI时&#xff0c;可以在UI线程中直接调用invalidate()方法。 内部实现&#xff1a;调用了invalidate方法后&#xff0c;为该View添加一个标记位&#xff0c;同时不断向父…

Go-知识协程

Go-知识协程 1. 基本概念1.1 进程1.2 线程1.3 协程 2. 协程的优势3. 调度模型3.1 线程模型3.2 Go调度器模型 4. 调度策略4.1 队列轮转4.2 系统调用4.3 工作量窃取4.4 抢占式调度 5. GOMAXPROCS对性能的影响 一个小活动&#xff1a; https://developer.aliyun.com//topic/lingma…

virtualbox 日常运维

前言 虽然平常以macOS和Linux作为主打工作环境&#xff0c;但还是有很多需要用到windows的时候&#xff0c;如camtasia和券商QMT软件。 在二手ThinkPad P53上安装了几个windows虚机&#xff0c;作为测试环境。Mac笔记本远程桌面连接嫌麻烦&#xff0c;还是命令行舒服。MacOS自…

C++经典面试题目(十七)

1、请解释拷贝构造函数的作用&#xff0c;并说明其调用时机。 拷贝构造函数是一种特殊的构造函数&#xff0c;用于创建一个新对象&#xff0c;其内容与另一个对象相同。它将一个已存在的对象作为参数&#xff0c;并使用该对象的值来初始化新创建的对象。拷贝构造函数的调用时机…

【CANoe】CAPL_E2E测试-验证报文中的CRC值是否正确

文章目录 一、背景二、CRC校验算法实现_dll制作三、CAPL脚本编写四、测试结果4.1、Write输出窗口4.2、测试报告截图一、背景 在嵌入式软件开发过程中,对于一些报文,需要实现安全发送与安全接收,这就涉及到CRC和RollingCounter。整车和MCU通讯的报文需要对方进行校验才能正确…

计算机网络—TCP协议详解:特性、应用(1)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;マリンブルーの庭園—ずっと真夜中でいいのに。 0:34━━━━━━️&#x1f49f;──────── 3:34 &#x1f504; ◀️…

Linux文件与进程交互的窥探者lsof

lsof 是一个 Linux 和 UNIX 系统中的实用工具,用于列出系统中打开文件的所有信息。这个名字代表 “List Open Files”,但它也可以显示进程相关的其他信息,如: 打开的文件描述符列表 打开网络连接的列表 被进程使用的信号和内核对象等 在Linux系统中,有一个经典的概念: …

【御控物联】JavaScript JSON结构转换(6):对象To对象——综合应用

文章目录 一、JSON结构转换是什么&#xff1f;二、术语解释三、案例之《JSON对象 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0…

七月论文审稿GPT第4版:通过paper-review数据集微调Mixtral-8x7b,对GPT4胜率超过80%

前言 在此之前&#xff0c;我司论文审稿项目组已经通过我司处理的paper-review数据集&#xff0c;分别微调了RWKV、llama2、gpt3.5 16K、llama2 13b、Mistral 7b instruct、gemma 7b 七月论文审稿GPT第1版&#xff1a;通过3万多篇paper和10多万的review数据微调RWKV七月论文审…

C++: 命名空间/C++输入输出/缺省参数/函数重载/引用/内联函数

进入C以后&#xff0c;就翻开了新的篇章。C支持C语言的使用。事实上&#xff0c;C是创建者在发现C语言中有很多不好用的地方&#xff08;在后续学习中会明显看到&#xff09;后&#xff0c;在C语言基础上又加入了许多语法&#xff0c;于是就成了C。 1.命名空间 来源&#xff…

java(4)之运算符

1、算术运算符 运算符含义表达式加11-减1-1*乘1*2/除2/1%取余5%2 2、赋值运算符 即 表示将右边的值赋给左边的变量 即 int i &#xff1b; i 1&#xff1b; 运算符含义 表达式 x xyxy-x x-yx - y*x x*yx*y/x x/yx /y%x x%yx %y 代码示例 public class Main {pub…