LC108-将有序数组转化为二叉搜索树(二叉平衡树)

news2024/11/25 0:01:16

文章目录

  • 1 题目
  • 2 思路
  • 3 ACM完整代码
  • 参考

1 题目

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

示例:
输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案

在这里插入图片描述
在这里插入图片描述

2 思路

构造平衡二叉树?岂不是在不平衡的时候还需要左旋和右旋,这是对于一般的数组构建二叉平衡树来说的:就是当不满足任意一个左右子树高度之差的绝对值小于等于1的时候,需要进行旋转来保持二叉树的平衡。

但是这是一个排序好的数组,想一想,取中间的元素作为根元素,其余元素作为子树来构建二叉树,不是刚刚能达到平衡的条件吗?因为左右子树的个数都是一样的,如果还继续这样构造下去,一定能满足平衡的条件;想一想三个节点的情况,[1, 2, 3] 使用2作为根节点来构造

因此对于排序好的数组构建二叉平衡树,直接取中间元素作为根元素即可

注意:
对于奇数个元素还是偶数个元素取mid的问题,如果是奇数个,刚好能取到中间;如果是偶数个,则取中间两个的后一个;如果取前一个,都是正确的,所以才导致答案不唯一;
如何取mid?int mid = (left+right)/2;还是int mid = left + (right - left)/2; 其实第一种有溢出的风险,如果left和right都是Integer.MAX_VALUE就直接溢出了,计算结果错误,因此使用第二种更加合理

Code:

class Solution{

   public TreeNode sortedArrayToBST(int[] nums) {
       if (nums.length == 0) return null;
       int left = 0, right = nums.length - 1;
       TreeNode root = arrayToBST(nums, left, right);
       return root;
   }

   private TreeNode arrayToBST(int[] nums, int left, int right) {
       // 递归结束
       if (left > right) {
           return null;
       }
       int mid = left + ((right - left) / 2);    // 寻找中点防溢出计算
       TreeNode root = new TreeNode(nums[mid]);
       root.left = arrayToBST(nums, left, mid - 1);
       root.right = arrayToBST(nums, mid+1, right);
       return root;
   }

3 ACM完整代码

import java.util.*;

class TreeNode{

    int val;
    TreeNode left;
    TreeNode right;

    TreeNode() {}
    TreeNode(int val) {this.val = val; }

}

// Solution

public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = in.nextInt();
        }

        Solution solution = new Solution();

        TreeNode node = solution.sortedArrayToBST(nums);
        preOrderTree(node);
    }

    static void preOrderTree(TreeNode root) {
        if (root != null) {
            System.out.print(root.val + " ");
            preOrderTree(root.left);
            preOrderTree(root.right);
        }
    }

}
/*
test case:
5
-10 -3 0 5 9
 */

参考

https://www.programmercarl.com/0108.将有序数组转换为二叉搜索树.html

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

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

相关文章

最佳语音识别 Whisper-large-v3-turbo 上线,速度更快(本地安装 )

Openai 上线语音模型whisper-large-v3-turbo 在本文中&#xff0c;我们将介绍 whisper-large-v3-turbo 以及 whisper-web&#xff08;一个直接在浏览器中进行ML语音识别的开源项目&#xff09;。 尽管近年来出现了许多音频和多模态模型&#xff0c;但Whisper 仍是生产级自动语音…

类型模板参数与非类型模板参数

在C中&#xff0c;模板参数分为两种类型&#xff1a;类型参数和非类型参数。类型参数是指定模板类型名称的参数&#xff0c;而非类型参数是指定模板整型常量的参数。 模板参数不限定于类型&#xff0c;普通值也可作为模板参数&#xff0c;但这里值的类型只能是整形家族&#x…

Qt教程(001):Qt概述与安装

文章目录 一、Qt概述1.1 什么是Qt1.2 Qt优点1.3 Qt发展史1.4 支持的平台1.5 成功案例1.6 下载安装1.7 QtCreator介绍 一、Qt概述 1.1 什么是Qt Qt是一个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形界面所需的所有功能。它是完全面向对象的&…

快乐数(c语言)

1.「快乐数」 定义为&#xff1a;对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&#xff0c;那么这个数就是快乐数。如果 n 是 快乐数 就返…

打卡第三天 P5729 【深基5.例7】工艺品制作

今天是我打卡第三天&#xff0c;做个入门题吧(#^.^#) 题目描述 输入格式 输出格式 输出一个整数表示答案。 输入输出样例 输入 #1 4 4 4 1 1 1 1 2 2 2 输出 #1 56 说明/提示 C&#xff1a; #include<bits/stdc.h> using namespace std; long long a[100][100][1…

【ubuntu】修改用户名、主机名、主文件夹名、登录名、密码

目录 1.他们是什么 2.修改方法 2.1 修改用户密码 2.2 修改主机名 2.2.1 切换到root用户 2.2.2 修改名称 2.3 修改用户名 主文件夹名 登录名 2.2.1 sudoers 2.2.2 passwd 2.2.3 shadow 2.2.4 group 2.2.5 修改主文件夹名 3.重启 1.他们是什么 &#xff08;1&#xf…

初识 C 语言(2)

目录 一、sigined 和 unsigned1. unsigned 二、数据类型的取值范围三、变量的分类1. 局部变量2. 全局变量3. 全局变量和局部变量名称冲突 四、算数操作符1. 加法操作符&#xff08;&#xff09;2. 减法操作符&#xff08;-&#xff09;3. 乘法操作符&#xff08;\*&#xff09;…

认知杂谈96《反人性与顺人性》

内容摘要&#xff1a; 成长常被视为反人性的&#xff0c;因为它意味着要离开舒适区&#xff0c;面对挑战。然而&#xff0c;在与人共事时&#xff0c;顺应人性同样重要&#xff0c;它要求我们理解他人的需求和动机。为了平衡成长与顺应人性&#xff0c;我们应设定清晰目标&…

封装el-upload组件,用于上传图片和视频

使用环境 vue3element-ui plus 需要根据后端返回结构修改的函数&#xff1a;onPreview onRemove onSuccess 组件使用 基本使用 源代码&#xff1a; <script setup> import AutoUploadFile from /components/auto-upload-file/index.vue function change(urls){console.…

hdfs伪分布式集群搭建

1 准备 vmware 虚拟三台centos系统的节点三台机器安装好jdk环境关闭防火墙&#xff08;端口太多&#xff0c;需要的自行去开关端口&#xff09;hadoop压缩包解压至三台服务器 可在一台节点上配置完成后克隆为三台节点 2 host修改 vi /etc/hosts在每个节点上添加三台机器的i…

Linux环境搭建git服务器和代码自动化部署

在开发过程中&#xff0c;我们经常遇到的问题就是提交代码到测试地址&#xff0c;然后进行线上测试。 要实现Git代码的自动化部署&#xff0c;考虑以下几种方法 FTP提交&#xff1a;可以使用FTP将代码上传到服务器自动化部署工具&#xff1a;如Jenkins、当代码被推送到仓库时…

【JavaWeb实战项目】在线蛋糕商城的设计与实现(附完整源代码)

一、系统介绍 本项目分为前后台&#xff0c;分为管理员与普通用户两种角色&#xff0c;管理员登录后台&#xff0c;普通用户登录前台&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录 商品管理 订单管理 客户管理 类目管理等功能。 用户角色包含以下功能&a…

MySQL 表的操作

温馨提示&#xff1a;非特殊情况不要修改和删除表 创建表 第一种方式 第二种方式 第三种方式 简单查看 查看表 查询当前数据库&#xff1a;select database(); 查询当前数据库中具有的表&#xff1a;show tables; 查看表的简略信息&#xff1a;desc 表名1&#xff1b; 查看表的…

22.第二阶段x86游戏实战2-背包遍历REP指令详解

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

双十一狂欢派对 五款市面上获得好评的好物

一年一度的双十一购物狂欢派对即将到来&#xff0c;这一天不仅是广大消费者的福利日&#xff0c;也是各大品牌展示实力的战场。随着市场的不断发展与消费者需求的多样化&#xff0c;双十一已经不仅仅是降价促销的代名词&#xff0c;更是品质与创新的竞技场。在琳琅满目的商品中…

【C++】--类与对象(1)

&#x1f9c7;个人主页: 起名字真南 &#x1f32d;个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 类的定义1.1 类定义格式1.1.1 Stack类1.1.2 Date类1.1.3 Struct格式 1.2 访问限定符1.3 类域 2 实例化2.2 对象大小 3 this指针 1 类的定义 1.1 类定义格式 1 class为定义…

软件设计之SSM(5)

软件设计之SSM(5) 路线图推荐&#xff1a; 【Java学习路线-极速版】【Java架构师技术图谱】 尚硅谷新版SSM框架全套视频教程&#xff0c;Spring6SpringBoot3最新SSM企业级开发 资料可以去尚硅谷官网免费领取 学习内容&#xff1a; AOP面向切面编程 代理AOP面向切面编程获取…

好用的股票预测八大算法的Python实现

股票预测算法通常涉及时间序列分析、统计学、机器学习和深度学习等多种方法。以下是经典的、常见的十大股票预测算法及其Python实现。这些算法各有优势&#xff0c;可以用于不同的市场预测场景。以下代码实现中&#xff0c;我们将使用yfinance下载数据&#xff0c;并展示各算法…

如何创建商业博客:一步一步教你从零开始

搭建一个成功的商业博客&#xff0c;不仅可以提升品牌形象&#xff0c;还能吸引更多潜在客户。作为一个在这方面有些经验的人&#xff0c;我来分享一些实用的步骤和建议&#xff0c;希望对你有所帮助。 一、明确你的目标和客户群体 确定目标&#xff1a;首先&#xff0c;你得搞…

Origin图像中插入各种符号以及矩形椭圆等

画各种形状 空白处右击 文字处右击