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

news2025/1/11 0:36:27

题意理解

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

        什么是高度平衡二叉树呢? 即对于每个节点来说,左右子树高度差不超过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.coloradmin.cn/o/1282278.html

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

相关文章

Centos系列:Centos7配置与安装DNS服务器

Centos7配置与安装DNS服务器 引言准备工作安装DNS要配置的文件配置主配置文件配置区域配置文件配置正向解析文件配置反向解析文件查看正向/反向配置文件的权限启动DNS服务测试是否配置成功 总结安装和配置会出现的问题 引言 centos7上安装DNS服务器可以实现域名与IP的双向解析…

福德植保无人机案例:无人机种地的那些事儿

大家好&#xff0c;今天我要给大家介绍一个非常有趣的案例&#xff0c;那就是我们的福德植保无人机工厂。这个工厂可不简单&#xff0c;它可是无人机植保领域的佼佼者&#xff0c;让我们一起来看看他们的故事吧&#xff01;首先&#xff0c;让我们来了解一下无人机植保这个概念…

难以置信,一个小小的需求让我捣鼓出一个提效的网站来

难以置信&#xff0c;一个小小的需求让我捣鼓出一个提效的网站来 需求介绍 事情是这样的&#xff0c;有个群友在业务当中碰到一个小小的需求&#xff0c;需求是这样的: 页面当中存在多个输入框&#xff0c;输入框的 value 值是一个数值组成的字符串&#xff08;盲猜应该是身份…

如何将Java条码Dynamsoft Barcode Reader集成到命令行、GUI和Web应用程序中

Dynamsoft Barcode Reader SDK一款多功能的条码读取控件&#xff0c;只需要几行代码就可以将条码读取功能嵌入到Web或桌面应用程序。这可以节省数月的开发时间和成本。能支持多种图像文件格式以及从摄像机或扫描仪获取的DIB格式。使用Dynamsoft Barcode Reader SDK&#xff0c;…

C++: 多态基本概念及原理

多态的基本概念&#xff1a; 多态是 C 面向对象三大特性之一 多态分为两类&#xff1a; 静态多态 : 函数重载 和 运算符重载属于静态多态&#xff0c;复用函数名 动态多态 : 派生类和虚函数实现运行时多态 静态多态和动态多态区别&#xff1a; 静态多态的函数地址早绑定 …

手机充电器市场分析:预计2028年将达到82亿美元

在5G时代飞速发展的今天&#xff0c;随着科技的进步、应用的发展以及人们对以智能手机、平板电脑、智能穿戴设备为代表的智能终端设备追求越来越高的品质和功能&#xff0c;智能终端设备产品的更新换代的速度越来越快&#xff0c;这也将给全球智能终端充储电产品市场带来更大的…

linux resin的安装

1. 下载安装包 1.1 下载地址&#xff1a;https://caucho.com/products/resin/download 这里我下载的是普通版本的resin&#xff0c;没有选resin pro 版本。 科普一下&#xff0c;从性能上来说 resin和resin pro 版本的性能没区别。 resin pro 版本的 和resin 普通版本的文件是…

Prometheus+Grafana搭建日志采集

介绍 一、什么是日志数据采集 日志数据采集是指通过各种手段获取应用程序运行时产生的各类日志信息&#xff0c;并将这些信息存储到特定的地方&#xff0c;以便后续分析和使用。通常情况下&#xff0c;这些日志信息包括系统运行状态、错误信息、用户操作记录等等。通过对这些…

外贸建站是WP还是CMS?海洋建站教程指南?

外贸建站选WP还是CMS系统&#xff1f;外贸企业网站建站怎么做&#xff1f; 随着全球化的不断发展&#xff0c;越来越多的企业开始拓展海外市场&#xff0c;外贸建站成为了这些企业的必备项目。然而&#xff0c;选择使用哪种建站系统却是一个让人头疼的问题。那么&#xff0c;海…

Pytorch深度强化学习1-5:详解蒙特卡洛强化学习原理

目录 0 专栏介绍1 蒙特卡洛强化学习2 策略评估原理3 策略改进原理3.1 同轨蒙特卡洛强化学习3.2 离轨蒙特卡洛强化学习 0 专栏介绍 本专栏重点介绍强化学习技术的数学原理&#xff0c;并且采用Pytorch框架对常见的强化学习算法、案例进行实现&#xff0c;帮助读者理解并快速上手…

centos安装Python3之后yum不能使用异常

场景&#xff1a; 需要在centos上安装Python3&#xff0c;但是安装Python3之后出现yum不能使用的问题。 问题描述 在centos上安装python3之后出现yum使用不了问题&#xff0c;使用yum会报如下信息&#xff1a; [roothadoop101~]# yum install wgetFile "/usr/bin/yum&q…

Synchronized关键字的底层原理

Synchronized实现 Synchronized创建的时候一个互斥的对象锁&#xff0c;每次只有一个线程可以获取该锁。 其底层主要是基于Monitor实现的&#xff0c;在对象的对象头中存储了MarkWord存储的就是Monitor的地址。 对象的内存结构 对象在内存中存储主要分为三个部分&#xff1a…

【IEEE独立出版|EI会议征稿】2024年第四届消费电子与计算机工程国际学术会议(ICCECE 2024)

2024年第四届消费电子与计算机工程国际学术会议&#xff08;ICCECE 2024&#xff09; 2024 4th International Conference on Consumer Electronics and Computer Engineering 进入21世纪以来&#xff0c;计算机技术的高速发展带来了消费电子产品的快速更迭。在技术迅速发展历…

docker配置redis主从、哨兵集群

docker配置redis主从、哨兵集群 搭建redis主从 准备工作 在/usr/local/software/redis/文件夹下建立如下的文件夹、文件 rootlocalhost redis]# mkdir -p 6379/conf 6379/data 6379/log [rootlocalhost redis]# mkdir -p 6380/conf 6380/data 6380/log [rootlocalhost re…

基于ssm的疫苗预约系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于ssm的疫苗预约系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

【Python动漫系列】喜羊羊(完整代码)

文章目录 喜羊羊环境需求完整代码程序分析系列文章喜羊羊 喜羊羊是中国大陆一部儿童动画片《喜羊羊与灰太狼》中的主角之一。这部动画片自2005年开始播出,成为许多中国儿童最喜欢的动画之一。 喜羊羊是一只体型较小、毛色洁白的绵羊,性格机灵活泼,聪明机智。他是一只勇敢而…

python获取阿里云云解析dns的域名解析记录

最近由于工作原因接触到阿里云的服务&#xff0c;我需要实时获取所有的域名信息&#xff0c;用于对其进行扫描&#xff0c;因此写了一个自动化爬取脚本 给需要的人分享。 &#xff08;阿里云有官方的demo&#xff0c;有兴趣的可以自己看一下&#xff0c;后面也会放链接&#xf…

Cesium 顶点吸附和区域拾取

Cesium 顶点吸附和区域拾取 基于深度实现可以自定义拾取范围大小 // 顶点吸附// const result pickAreaHelper.pickNearest(viewer.scene, movement.endPosition, 32, 32);// 区域拾取const result pickAreaHelper.pickArea(viewer.scene, movement.endPosition, 32, 32);顶…

深度学习——第3章 Python程序设计语言(3.2 Python程序流程控制)

3.2 Python程序流程控制 目录 1.布尔数据类型及相关运算 2.顺序结构 3.选择&#xff08;分支&#xff09;结构 4.循环结构 无论是在机器学习还是深度学习中&#xff0c;Python已经成为主导性的编程语言。而且&#xff0c;现在许多主流的深度学习框架&#xff0c;例如PyTorc…

揭秘强化学习:Python 实践指南

一、说明 强化学习 (RL) 是机器学习和人工智能 (AI) 的一个子领域&#xff0c;专注于开发能够通过与环境交互进行学习的智能代理。与传统的监督和无监督学习不同&#xff0c;强化学习主要关注动态、顺序环境中的决策。它在人工智能中具有重要意义&#xff0c;特别是在自主代理必…