【LeetCode刷题记录】简单篇-108-将有序数组转换为二叉搜索树

【题目描述】

给你一个整数数组 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]  都是高度平衡二叉搜索树。


【思路分析】

平衡二叉搜索树(BST)的特点是中序遍历的结果是一个递增的序列。换句话说,它的根节点的左子树的节点值全部小于根节点,根节点的右子树的节点值全部大于根节点(这棵树的所有节点都可以作为这里说的根节点)。

本题给定了一个升序序列,要转换为BST,根据上面说的特点,这个序列的中间元素就是这棵树的根节点,以这个中间元素为间隔,其左边的元素就是这棵树的左子树节点,其右边的元素就是这棵树的右子树节点,以此递归下去,在左边的元素中,最中间的元素作为左子树的根节点,又将该左区间划分为了两部分;在右边的元素中,最中间的元素作为右子树的根节点,又将右区间划分为了两部分。

看到这里,大家应该发现了,这其实和二分查找算法有异曲同工之处。区别在于二分查找每次只找两个区间中的一个,而这道题要对每次分出来的所有区间都做操作。

说到这里,代码的逻辑就已经很清晰了。left和right用于表示nums的区间范围,当left > right时,说明这时已经没有元素了,直接返回NULL。第一次递归的时候,left=0,right=nums.size()-1,表示整个nums数组。mid=left + (right - left) / 2表示中间元素(用这种方法算mid是为了防止溢出,之前的题目中也出现过),然后直接以nums[mid]创建一个树节点res,那么这棵树的左子树res->left就是nums的[left, mid-1]区间的元素,右子树res->right就是nums的[mid+1, right]区间的元素。对这两个区间再次分别递归下去,最后返回的res就是我们要求的BST。


【参考代码】

C实现

#include <stdio.h>//easy-108-将有序数组转化为二叉搜索树 
struct TreeNode* createBST(int* nums, int left, int right);
struct TreeNode* sortedArrayToBST(int* nums, int numsSize);struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;
};struct TreeNode* createBST(int* nums, int left, int right){if(left > right){return NULL;}int mid = left + (right - left) / 2;struct TreeNode* res = (struct TreeNode*)malloc(sizeof(struct TreeNode));res->val = nums[mid];res->left = createBST(nums, left, mid - 1);res->right = createBST(nums, mid + 1, right);return res;
}struct TreeNode* sortedArrayToBST(int* nums, int numsSize) {return createBST(nums, 0, numsSize-1); 
}

C++实现

#include <iostream>
#include <vector>
using namespace std;//easy-108-将有序数组转化为二叉搜索树
struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode() : val(0), left(nullptr), right(nullptr) {}TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};class Solution {
public:TreeNode* createBST(vector<int>& nums, int left, int right);TreeNode* sortedArrayToBST(vector<int>& nums);
};TreeNode* Solution::createBST(vector<int>& nums, int left, int right){if(left > right){return NULL;}int mid = left + (right - left) / 2;struct TreeNode* res = new struct TreeNode(nums[mid]);res->left = createBST(nums, left, mid - 1);res->right = createBST(nums, mid + 1, right);return res;
}TreeNode* Solution::sortedArrayToBST(vector<int>& nums){return createBST(nums, 0, nums.size());
}

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

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

相关文章

【功耗问题排查】

一、如何处理具体功耗case 在手机功耗测试中&#xff0c;因为我们在功耗测试中&#xff08;电源电压&#xff09;为固定值&#xff08;老手机一般为3.8V左右&#xff0c;现在的大多项目采用4V左右&#xff09;&#xff0c;那么的大小直接由决定&#xff0c;所以&#xff0c;在沟…

webassembly入门详解(C++)

一、环境配置 环境说明,操作系统为window操作系统。 1.1 下载和安装python 下载 需要python版本至少3.6版本 python下载地址:https://www.python.org/getit/ 安装 检测安装结果 win+R组合键->cmd->输入python->回车 1.2 下载和安装emsdk 下载 下载地址:https://gi…

vs2019 - 替换vs2019自带的cmake

文章目录 vs2019 - 替换vs2019自带的cmake概述笔记启动vs2019本地x64命令行的脚本查看vs2019自带的cmake的位置删掉旧版cmake将新版cmake的安装目录内容替换过来。查看vs2019本地x64命令行中的cmake版本配置为vs2019x64工程END vs2019 - 替换vs2019自带的cmake 概述 在看一个…

项目启动后 数据库表结构会被自动修改 删除字段

问题还原 我这表是有warehouse_code这个字段的 然后我启动项目后&#xff0c;发现这个字段被删除了 解决办法 看你的配置中是否有下面的配置 把这个配置删除就行了&#xff0c;这配置是根据Java实体来来创建修改数据库结构的

LINUX 入门 4

LINUX 入门 4 day6 7 20240429 20240504 耗时&#xff1a;240min 课程链接地址 第4章 LINUX环境编程——实现线程池 C基础 第3节 #define里面的行不能乱空行&#xff0c;要换行就打\ typedef 是 C 和 C 中的一个关键字&#xff0c;用于为已有的数据类型定义一个新的名字。…

SpringBoot 自定义 HandlerMethodArgumentResolver 搞定xml泛型参数解析

文章目录 介绍一、解析简单 xml 数据案例引入 Jackson 的 xml 支持定义 Message 对象&MessageHeader 对象定义 Controller 方法调用结果 二、解析带泛型的 XML 数据案例2.1 直接给 Message 加上泛型 T2.2 无法直接解析泛型参数了 三、自定义 MVC 的参数解析器实现泛型参数解…

OCR文本识别模型CRNN

CRNN网络结构 论文地址&#xff1a;https://arxiv.org/pdf/1507.05717 参考&#xff1a;https://blog.csdn.net/xiaosongshine/article/details/112198145 git:https://github.com/shuyeah2356/crnn.pytorch CRNN文本识别实现端到端的不定长文本识别。 CRNN网络把包含三部分&…

两个手机在一起ip地址一样吗?两个手机是不是两个ip地址

在数字时代的浩瀚海洋中&#xff0c;手机已经成为我们生活中不可或缺的一部分。随着移动互联网的飞速发展&#xff0c;IP地址成为了连接手机与互联网的桥梁。那么&#xff0c;两个手机在一起IP地址一样吗&#xff1f;两个手机是不是两个IP地址&#xff1f;本文将带您一探究竟&a…

微火全域外卖系统是什么?为什么市场占有率这么高?

近日&#xff0c;全域外卖领域又出现了新变动&#xff0c;一个名为微火的品牌凭借着其全域外卖系统&#xff0c;在短短几个月的时间里&#xff0c;就占领了大部分市场。截止发稿日期前&#xff0c;微火全域外卖系统的市场占有率已经超过48%。 据了解&#xff0c;所谓的全域外卖…

微信小程序之搜索框样式(带源码)

一、效果图&#xff1a; 点击搜索框&#xff0c;“请输入搜索内容消失”&#xff0c;可输入关键字 二、代码&#xff1a; 2.1、WXML代码&#xff1a; <!--搜索框部分--><view class"search"><view class"search-btn">&#x1f50d;&l…

数据库复习2

试述SQL的特点 有两个关系 S(A,B,C, D)和 T(C,D,E,F)&#xff0c;写出与下列查询等价的 SQL 表达式: 用SQL语句建立第2章习题6中的4个表&#xff1b;针对建立的4个表用SQL完成第2章习题6中的查询 针对习题4中的4个表试用SQL完成以下各项操作 (1)找出所有供应商的姓名和所在城市…

[图解]SysML和EA建模住宅安全系统-02

1 00:00:00,900 --> 00:00:02,690 这个就是一个块定义图了 2 00:00:03,790 --> 00:00:04,780 简称BDD 3 00:00:05,610 --> 00:00:08,070 实际上就是UML里面的类图 4 00:00:08,080 --> 00:00:09,950 和组件图的一个结合体 5 00:00:13,150 --> 00:00:14,690 我…

WDW-10B微机控制电子万能试验机技术方案

一&#xff0e;设备外观照片&#xff1a; 项目简介&#xff1a; 微机控制电子式万能试验机是专门针对高等院校、各种金属、非金属科研厂家及国家级质检单位而设计的高端微机控制电子式万能试验机、计算机系统通过全数字控制器&#xff0c;经调速系统控制伺服电机转动&#xff…

MT3033 新的表达式

代码&#xff1a; #include <bits/stdc.h> using namespace std; bool is_op(char c) {return c & || c |; } int priority(char op) { // 运算优先级。如果有-*/等别的运算符&#xff0c;则这个函数很有必要if (op & || op |){return 1;}return -1; } voi…

数据链路层(详细版)【01】

数据链路层是在物理层和网络层之间的协议&#xff0c;提供相邻节点的可靠数据传输 一、从体系结构来看数据链路层 数据链路层是为上下两层提供服务或者上下两层向他传送数据&#xff08;服务【垂直】&#xff09;&#xff1b;与其对等层之间用帧进行通信&#xff08;协议【水平…

2024年51cto下载的视频怎么导出

如果你喜欢在51cto上观看各种专业技术视频&#xff0c;那么你可能想将喜欢的视频保存到本地设备中&#xff0c;以便随时随地观看。今天&#xff0c;我们就来探讨一下如何在2024年将51cto下载的视频导出到你的设备中 下载51cto的工具我已经打包好了&#xff0c;有需要的自己下载…

重学java 31.API 2.StringBuilder

总有一天&#xff0c;我不再畏惧任何人的离开 —— 24.5.8 StringBuilder的介绍 1.概述 一个可变的字符序列,此类提供了一个与StringBuffer兼容的一套API&#xff0c;但是不保证同步&#xff08;线程不安全&#xff0c;效率高&#xff…

Qt 6.7 正式发布!

本文翻译自&#xff1a;Qt 6.7 Released! 原文作者&#xff1a;Qt Group研发总监Volker Hilsheimer 在最新发布的Qt 6.7版本中&#xff0c;我们大大小小作出了许多改善&#xff0c;以便您在构建现代应用程序和用户体验时能够享受更多乐趣。 部分新增功能已推出了技术预览版&a…

scikit-learn多因子线性回归预测房价

1.首先是单因子线性回归预测房价 import numpy as np import pandas as pd from matplotlib import pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score# 1.读取csa房屋数据 path D:/pythonDATA/us…

地道俄语口语,柯桥俄语培训哪家好

1、по-моему 依我看&#xff1b;在我看来 例&#xff1a; По-моему, сегодня будет дождь. 依我看, 今天要下雨。 Сделай по-моему. 按我的办法干吧 2、кажется 似乎是&#xff1b;看起来 例&#xff1a; Парень, …