leetcode hot100刷题日记——34.将有序数组转换为二叉搜索树

article/2025/6/23 15:54:21

在这里插入图片描述
在这里插入图片描述
First Blood:什么是平衡二叉搜索树?

二叉搜索树(BST)的性质
左小右大:每个节点的左子树中所有节点的值都小于该节点的值,右子树中所有节点的值都大于该节点的值
子树也是BST:左子树和右子树也必须是二叉搜索树。
中序遍历有序:对二叉搜索树进行中序遍历,可以得到一个按从小到大顺序排列的有序序列。

平衡二叉搜索树(Balanced BST)的性质
平衡性:平衡二叉搜索树在满足二叉搜索树所有性质的基础上,要求每个节点的左右子树的高度差的绝对值不超过1
高效操作:由于树的高度平衡,插入、删除和查找等操作的时间复杂度稳定在 O(log n) 级别。

递归思路:
数组中间的点是根节点。数组左边到中间的左子区间可以构成平衡二叉树的左子树。数组中间到右边的右子区间可以构成平衡二叉树的右子树。

/*** Definition for a binary tree node.* 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* dfs(vector<int>& nums,int left,int right){if(left==right){return nullptr;}int m=left+(right-left)/2;return new TreeNode(nums[m],dfs(nums,left,m),dfs(nums,m+1,right));}TreeNode* sortedArrayToBST(vector<int>& nums) {return dfs(nums,0,nums.size());}
};

为什么right是从nums.size()开始而不是nums.size()-1呢?

A:首先,right一开始可以是nums.size()-1,但也要:

class Solution {
public:TreeNode* dfs(vector<int>& nums, int left, int right) {if(left > right) {  // 注意终止条件变了return nullptr;}int m = left + (right - left) / 2;return new TreeNode(nums[m], dfs(nums, left, m-1),      // 注意这里变了dfs(nums, m+1, right));}TreeNode* sortedArrayToBST(vector<int>& nums) {return dfs(nums, 0, nums.size()-1);  // 这里就用 size()-1}
};

举例说明:nums = [1, 2, 3]

dfs([1,2,3], 0, 3)  // 处理 [0,3),即索引 0,1,2
├─ m = 1,选择 nums[1] = 2
├─ 左子树:dfs([1,2,3], 0, 1)  // 处理 [0,1),即索引 0
│  ├─ m = 0,选择 nums[0] = 1  
│  ├─ 左子树:dfs([1,2,3], 0, 0)  // [0,0) 空区间,left==right
│  └─ 右子树:dfs([1,2,3], 1, 1)  // [1,1) 空区间,left==right
└─ 右子树:dfs([1,2,3], 2, 3)  // 处理 [2,3),即索引 2├─ m = 2,选择 nums[2] = 3├─ 左子树:dfs([1,2,3], 2, 2)  // [2,2) 空区间,left==right  └─ 右子树:dfs([1,2,3], 3, 3)  // [3,3) 空区间,left==right
dfs([1,2,3], 0, 2)  // 处理 [0,2],即索引 0,1,2
├─ m = 1,选择 nums[1] = 2
├─ 左子树:dfs([1,2,3], 0, 0)  // 处理 [0,0],即索引 0
│  ├─ m = 0,选择 nums[0] = 1
│  ├─ 左子树:dfs([1,2,3], 0, -1)  // [0,-1] 空区间,left>right
│  └─ 右子树:dfs([1,2,3], 1, 0)   // [1,0] 空区间,left>right
└─ 右子树:dfs([1,2,3], 2, 2)  // 处理 [2,2],即索引 2├─ m = 2,选择 nums[2] = 3├─ 左子树:dfs([1,2,3], 2, 1)   // [2,1] 空区间,left>right└─ 右子树:dfs([1,2,3], 3, 2)   // [3,2] 空区间,left>right

在这里插入图片描述

时间复杂度分析:

主要操作分析:
1.每个节点只被访问一次:每次递归调用都会创建一个新节点
2.每次递归的工作量:
计算中点:O(1)
创建节点:O(1)
递归调用:分解为两个子问题

递推关系:
T(n) = 2 * T(n/2) + O(1)
其中:
T(n) 表示处理n个元素的时间
2 * T(n/2) 表示处理左右两个子树
O(1) 表示当前层的操作时间

递推求解:

T(n) = 2 * T(n/2) + 1
T(n/2) = 2 * T(n/4) + 1
T(n/4) = 2 * T(n/8) + 1
...
展开:
T(n) = 2 * (2 * T(n/4) + 1) + 1 = 4 * T(n/4) + 2 + 1
T(n) = 4 * (2 * T(n/8) + 1) + 3 = 8 * T(n/8) + 4 + 3
...
T(n) = 2^k * T(n/2^k) + (2^k - 1)

当 n/2^k = 1 时,即 k = log₂(n):
T(n) = n * T(1) + (n - 1) = n * 1 + n - 1 = 2n - 1 = O(n)
所以时间复杂度为O(n)

空间复杂度:O(log n)
递归深度:
每次递归将问题规模减半
递归深度 = log₂(n)
每层递归占用常数空间
调用栈空间:O(log n)


http://www.hkcw.cn/article/ttmwXuZTdI.shtml

相关文章

使用yocto搭建qemuarm64环境

环境 yocto下载 # 源码下载 git clone git://git.yoctoproject.org/poky git reset --hard b223b6d533a6d617134c1c5bec8ed31657dd1268 构建 # 编译镜像 export MACHINE"qemuarm64" . oe-init-build-env bitbake core-image-full-cmdline 运行 # 跑虚拟机 export …

探索TiDB数据库:WordPress在分布式数据库上的部署实践

作者&#xff1a; 江湖有缘 原文来源&#xff1a; https://tidb.net/blog/359d4e00 引言 在当今数据驱动的互联网应用中&#xff0c;数据库的性能与可扩展性已成为系统架构中的关键一环。WordPress 作为全球最流行的网站内容管理系统之一&#xff0c;传统上依赖于 MySQL 等…

2.3JS变量和数据类型m

1.认识JS变量 变化数据的记录--变量 2.变量的命名格式 在JS中如何命名一个变量呢 变量的声明&#xff1a;在JS中声明一个变量使用var关键字&#xff08;variable单词的缩写&#xff09;&#xff08;后续学习ES6还有let、const声明方式&#xff09; 变量赋值&#xff1a;使用给变…

深度学习总结(41)

微调预训练模型 另一种常用的模型复用方法是微调&#xff0c;如图所示&#xff0c;它与特征提取互为补充。微调是指&#xff0c;对于用于特征提取的已冻结模型基&#xff0c;将其顶部几层“解冻”​&#xff0c;并对这解冻的几层与新增加的部分&#xff08;本例中为全连接分类…

QT入门学习

一: 新建QT项目 二:QT文件构成 2.1 first.pro 项目管理文件&#xff0c;下面来看代码解析 QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11TARGET main# The following define makes your compiler emit warnings if you use # any Qt feature …

kaggle 预测房价

利用简单的线性模型&#xff0c;训练kaggle 房屋数据集&#xff1a; import os import random import tarfile import time import zipfile import pandas as pd import requests import torch from torch import nn from torch.utils import data from matplotlib import pyp…

ASP.NET Core SignalR的基本使用

文章目录 前言一、SignalR是什么&#xff1f;在 ASP.NET Core 中的关键特性&#xff1a;SignalR 工作原理简图&#xff1a; 二、使用步骤1.创建ASP.NET Core web Api 项目2.添加 SignalR 包3.创建 SignalR Hub4.配置服务与中间件5.创建控制器(模拟服务器向客户端发送消息)6.创建…

AI书签管理工具开发全记录(七):页面编写与接口对接

文章目录 AI书签管理工具开发全记录&#xff08;七&#xff09;&#xff1a;页面编写与接口对接前言 &#x1f4dd;1. 页面功能规划 &#x1f4cc;2. 接口api编写 &#x1f4e1;2.1 创建.env,设置环境变量2.2 增加axios拦截器2.3 创建接口 2. 页面编写 &#x1f4c4;2.1 示例代…

“AI 编程三国杀” Google Jules, OpenAl Codex, Claude Code,人类开始沦为AI编程发展的瓶颈?

AI 编程三国杀:Google Jules, OpenAI Codex, Claude code “AI 编程三国杀”是一个形象的比喻,借指当前 AI 编程领域中几个主要参与者之间的激烈竞争与并存的局面。这其中,Google、OpenAI 以及 Anthropic (Claude 的开发者) 是重要的“国家”,而它们各自的 AI 编程工具则是…

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 文件事件处理部分)

分析客户端和服务端网络诵信交互实现 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 命令请求的执行过程案例分析介绍发送命令请求读取命令请求客户端状态的argv属性和argc属性命令执行器第…

第29次CCF计算机软件能力认证-3-LDAP

LDAP 刷新 时间限制&#xff1a; 10.0 秒 空间限制&#xff1a; 512 MiB 下载题目目录&#xff08;样例文件&#xff09; 题目背景 西西艾弗岛运营公司是一家负责维护和运营岛上基础设施的大型企业&#xff0c;拥有数千名员工。公司内有很多 IT 系统。 为了能够实现这些…

2025年- H63-Lc171--33.搜索旋转排序数组(2次二分查找,需二刷)--Java版

1.题目描述 2.思路 输入&#xff1a;旋转后的数组 nums&#xff0c;和一个整数 target 输出&#xff1a;target 在 nums 中的下标&#xff0c;如果不存在&#xff0c;返回 -1 限制&#xff1a;时间复杂度为 O(log n)&#xff0c;所以不能用遍历&#xff0c;必须使用 二分查找…

HomeKit 基本理解

概括 HomeKit 将用户的家庭自动化信息存储在数据库中&#xff0c;该数据库由苹果的内置iOS家庭应用程序、支持HomeKit的应用程序和其他开发人员的应用程序共享。所有这些应用程序都使用HomeKit框架作为对等程序访问数据库. Home 只是相当于 HomeKit 的表现层,其他应用在实现 …

秒杀系统—5.第二版升级优化的技术文档三

大纲 8.秒杀系统的秒杀库存服务实现 9.秒杀系统的秒杀抢购服务实现 10.秒杀系统的秒杀下单服务实现 11.秒杀系统的页面渲染服务实现 12.秒杀系统的页面发布服务实现 8.秒杀系统的秒杀库存服务实现 (1)秒杀商品的库存在Redis中的结构 (2)库存分片并同步到Redis的实现 (3…

尚硅谷-尚庭公寓知识点

文章目录 尚庭公寓知识点1、转换器(Converter)2、全局异常3、定时任务1. 核心步骤(1) 启用定时任务(2) 创建定时任务 2. Scheduled 参数详解3. Cron 表达式语法4. 配置线程池&#xff08;避免阻塞&#xff09;5. 动态控制任务&#xff08;高级用法&#xff09;6. 注意事项 4、M…

字符串~~~

字符串~~ KMP例题1.无线传输2.删除字符串3.二叉树中的链表 AC自动机Manacher例题 扩展KMP字符串哈希 KMP &#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09; 经典例题 https://leetcode.cn/problems/find-the-index-of-the-first-occurre…

WEB3——简易NFT铸造平台之nft.storage

&#x1f9e0; 1. nft.storage 是什么&#xff1f; https://nft.storage 是 一个免费的去中心化存储平台&#xff0c;由 Filecoin 背后的 Protocol Labs 推出。 它的作用是&#xff1a; ✅ 接收用户上传的文件&#xff08;图片、JSON 等&#xff09; ✅ 把它们永久存储到 IPFS…

MCP架构全解析:从核心原理到企业级实践

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…

注销微软账户

若你需要注销微软账号&#xff0c;请点击下方超链接。 点击此处

华为OD机试真题——生成哈夫曼树(2025A卷:100分)Java/python/JavaScript/C/C++/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》 华为OD机试真题《生成…