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

题意理解

        我们需要根据一个数组来构建一个二叉搜索树,且该二叉搜索树也是高度平衡二叉树。

        什么是高度平衡二叉树呢? 即对于每个节点来说,左右子树高度差不超过1

        思路:我们总是从数组的中间位置作为根节点构建该树,这样就能保证左子树和右子树节点数目差值不超1。

解题方法

        递归        迭代       

1.递归

首先明确,我们总是先构造根节点,然后构造左子树,构造右子树。最终返回一棵完整的树。

如果输入的数组为nums长度为0,那么返回一个null。

额外补充一点,对于数组区间的判定经常会出错,可以先规定是左闭右开,还是左开右闭,然后严格按照约定来执行。

public TreeNode sortedArrayToBST(int[] nums) {if(nums.length==0) return null;int mid= Math.floorDiv(nums.length,2);TreeNode root=new TreeNode(nums[mid]);TreeNode left=sortedArrayToBST(Arrays.copyOfRange(nums,0,mid));TreeNode right=sortedArrayToBST(Arrays.copyOfRange(nums,mid+1,nums.length));root.left=left;root.right=right;return root;}//方法二
public TreeNode sortedArrayToBST(int[] nums) {return sortedArrayToSubBST(nums,0,nums.length);}public TreeNode sortedArrayToSubBST(int[] nums,int left,int right) {if(left>=right) return null;if(right-left==1) return new TreeNode(nums[left]);int mid= left+Math.floorDiv((right-left),2);TreeNode root=new TreeNode(nums[mid]);TreeNode leftNode=sortedArrayToSubBST(nums,left,mid);TreeNode rightNode=sortedArrayToSubBST(nums,mid+1,right);root.left=leftNode;root.right=rightNode;return root;}

2.迭代

迭代法的话,需要进行分析。

为了实现迭代,我们需要三个来进行维护,一个用来维护当前新建节点,一个用来数组左子树下标,另一个用来维护右子树下标。

public TreeNode sortedArrayToBST2(int[] nums) {Queue<TreeNode> nodes=new LinkedList<>();Queue<Integer> leftIndex=new LinkedList<>();Queue<Integer> rightIndex=new LinkedList<>();//初始化TreeNode root=new TreeNode();nodes.offer(root);leftIndex.offer(0);rightIndex.offer(nums.length-1);//为了实现迭代使用三个数组while(!nodes.isEmpty()){//创建根节点TreeNode curNode=nodes.poll();int left=leftIndex.poll();int right=rightIndex.poll();int mid=Math.floorDiv((left+right),2);curNode.val=nums[mid];//处理左区间if(left<=mid-1){curNode.left=new TreeNode();nodes.offer(curNode.left);leftIndex.offer(left);rightIndex.offer(mid-1);}//处理右区间if(right>=mid+1){curNode.right=new TreeNode();nodes.offer(curNode.right);leftIndex.offer(mid+1);rightIndex.offer(right);}}return root;}

3.分析

时间复杂度:

        递归:O(n)

        迭代:O(n)

空间负责度:

        递归:O(n)

        迭代:O(3n)

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

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

相关文章

AcW730.机器人跳跃问题(二分法)-Java版

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;//由题目可知,无论能量大与小,都满足 e 2 * e - h[i]; //初始能量越大,最终的结果越大,要找到一个满足条件的最小值 //可以根据二分的向左找模板: /*if(check(mid)) r mid;els…

茄子科技张韶全:跨多云大数据平台DataCake在OceanBase的实践

11 月 16 日&#xff0c;OceanBase 在北京顺利举办 2023 年度发布会&#xff0c;正式宣布&#xff1a;将持续践行“一体化”产品战略&#xff0c;为关键业务负载打造一体化数据库。其中&#xff0c;在“数字化转型升级实践专场”&#xff0c;我们有幸邀请到了茄子科技大数据技术…

一个Blazor+WinForm+MAUI+PDA实现的条码比对系统

条码比对系统是由单机版桌面软件和Android版的PDA扫码软件组成&#xff0c;桌面软件采用Blazor与WinForm进行混合开发&#xff0c;PDA扫码软件采用MAUI进行开发&#xff0c;这个项目都是基于.NET技术进行构建&#xff0c;这也是将近期学习Blazor和MAUI这两门技术应用到实践当中…

刷题系列——排序算法

参考&#xff1a;README - 十大经典排序算法 1&#xff09;排序算法分为内部外部排序两种&#xff0c;这个之前并不了解&#xff0c;外部排序需要访问外存的这个就是指需要额外内存比如另一个list或者dict存储中间结果。 2&#xff09;稳定性&#xff1a;排序后 2 个相等键值…

openGauss训练营培训课程第1课时

课时1:openGauss全景介绍 1、介绍 openGauss 全景 1.1.openGauss总体架构介绍 本章节主要介绍了openGauss发展的历史&#xff0c;现状以及未来。对当前的DataPod和DataKit 2种openGauss当前主推的场景化产品进行了介绍。同时对openGauss的整个逻辑模块的视图进行了讲解。 …

算法通关村第十三关-黄金挑战数论问题

计数质数 描述 : 给定整数 n &#xff0c;返回 所有小于非负整数 n 的质数的数量 。 题目 : LeetCode 204.计数质数 : 204. 计数质数 分析 : 解决这个题有一个有效的方法&#xff0c;叫埃氏筛 , 后来又产生了线性筛&#xff0c;奇数筛等改进的方法。 基本思想是如果 x是…

12.04 二叉树中等题

513. 找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1 思路&#xff1a;找到最低层中最左侧的节点值&#xff0c;比较适合层序遍历&#xff0c;返回最…

【动态规划】LeetCode-198/LCR089.打家劫舍

&#x1f388;算法那些事专栏说明&#xff1a;这是一个记录刷题日常的专栏&#xff0c;每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目&#xff0c;在这立下Flag&#x1f6a9; &#x1f3e0;个人主页&#xff1a;Jammingpro &#x1f4d5;专栏链接&…

MS85163实时时钟/日历可Pin to Pin兼容PCF8563

MS85163/MS85163M是一款CMOS实时时钟(RTC) 和日历电路&#xff0c;针对低功耗进行了优化&#xff0c;内置了可编程的时钟输出、中断输出和低电压检测器。可Pin to Pin兼容PCF8563。所有寄存器地址和数据都通过两线双向I 2C总线进行串行传输&#xff0c;最大总线传输速度为 400k…

2023年【上海市安全员C3证】新版试题及上海市安全员C3证试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 上海市安全员C3证新版试题是安全生产模拟考试一点通总题库中生成的一套上海市安全员C3证试题及解析&#xff0c;安全生产模拟考试一点通上上海市安全员C3证作业手机同步练习。2023年【上海市安全员C3证】新版试题及上…

干货分享:盘点8款优秀的自动化测试工具

如今&#xff0c;作为一名软件测试工程师&#xff0c;几乎所有人都需要具备自动化测试相关的知识&#xff0c;并且懂得如何去利用工具&#xff0c;来为企业减少时间成本和错误成本。这是为什么呢&#xff1f; 在以前&#xff0c;测试人员一般都只需要扮演终端用户&#xff0c;…

用Python创建日历详细指南与实用示例

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 用Python创建日历详细指南与实用示例&#xff0c;全文4800字&#xff0c;阅读大约15分钟。 在日常生活和工作中&#xff0c;创建和管理日历是一项关键任务。Python提供了丰富…

【ArcGIS Pro微课1000例】0047:深度学习--棕榈树提取全流程

一、创建训练样本 对汤加科洛瓦伊种植园每棵棕榈树的健康状况进行清查和评估,这需要花费大量的时间和劳动力。 为简化此过程,将在 ArcGIS Pro 中使用深度学习模型来识别树木,然后根据植被绿度的测量值计算其健康状况。 第一步是找到显示汤加科洛瓦伊的影像,该影像具有足够…

无需服务器,无需魔法,拥有一个微信机器人就是这么简单

前情提要 还没看过的朋友可以看一下上一篇文章《拥有一个微信机器人总共需要几步&#xff1f;》在这篇文章里&#xff0c;我们提到&#xff0c;创建微信机器人需要一个大前提--你得有一台服务器。现在&#xff0c;不再需要了&#xff01;没错&#xff0c;上一篇提到的Serverles…

巧借C++算法实现冒泡排序算法

目录 引言冒泡排序原理具体实现步骤示例代码时间复杂度和稳定性优化可能性结束语 引言 作为计算机专业出身的开发者&#xff0c;以及从事软件开发相关的小伙伴&#xff0c;想必对C语言并不陌生&#xff0c;它是一门非常厉害的编程语言&#xff0c;不仅是基于程序底层的语言&a…

JavaSE基础50题:9. 求1~100内的所有素数

【概述】 素数&#xff1a;只能被1和自己整除。 素数的判断方法&#xff1a; 我们把非素数都写成 ab 的形式&#xff0c;如&#xff1a; 16 116 16 28 24 124 24 212 24 38 24 46 同样&#xff0c;我们发现&#xff0c;a 和 b 其中一定会有一个数字 < 根号n&#xff0…

SIT2596,可替代LM2596,40V 输入 150KHz 3A 降压型电源转换器

SIT2596 是一款降压型开关电压调节芯片&#xff0c;可固定输出 3.3V、5V、12V&#xff0c;也可根据需要调节 输出电压&#xff0c;电压输出范围在 1.2V-37V&#xff0c;输入电压最高可达 40V,输出电流可达 3A;同时具有优异 的线性调整率和负载调整率。 SIT2596 内部集成频率…

中危漏洞!小程序优惠卷遍历

进入小程序&#xff0c;因为是一个小商城&#xff0c;所以照例先查看收货地址是否存在越权&#xff0c;以及能否未授权访问&#xff0c;但是发现不存在这些问题&#xff0c;所以去查看优惠卷 进入领券中心&#xff0c;点击领取优惠券时抓包 发现数据包&#xff0c;存在敏感参数…

DevEco Studio将常用内容设为代码模板 通过快捷键调出

有时候 我们开发 可能有一些经常要写的内容 天天CV大法找东西也非常麻烦 我们这里打开编辑器 选择 File下的Settings 打开设置界面 选择 Editor 下的 Live Templates 模板 然后 我们点击右侧加号 然后点第一个 加一个 这里 我们设置 输入 em时会触发提示 内容时 问君能有几…

使用Serv-U FTP服务器共享文件,实现无公网IP环境下远程访问

文章目录 1. 前言2. 本地FTP搭建2.1 Serv-U下载和安装2.2 Serv-U共享网页测试2.3 Cpolar下载和安装 3. 本地FTP发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 科技日益发展的今天&#xff0c;移动电子设备似乎成了我们生活的主角&#xff0c;智能…