当前位置: 首页 > news >正文

LeetCode 235. 二叉搜索树的最近公共祖先

LeetCode 235. 二叉搜索树的最近公共祖先

1、题目

题目链接:235. 二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]
image.png

示例 1:

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
输出: 6 
解释: 节点 2 和节点 8 的最近公共祖先是 6。

示例 2:

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
输出: 2
解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。

说明:

  • 所有节点的值都是唯一的。
  • p、q 为不同节点且均存在于给定的二叉搜索树中。

2、递归

思路

代码

class Solution {
private:TreeNode* traversal(TreeNode* cur, TreeNode* p, TreeNode* q) {if (cur == nullptr) {return cur;}// 如果当前节点的值大于p和q的值,则在左子树中继续搜索if (cur->val > p->val && cur->val > q->val) {TreeNode* left = traversal(cur->left, p, q);// 如果在左子树中找到了符合条件的节点,则返回该节点if (left != nullptr) {return left;}}// 如果当前节点的值小于p和q的值,则在右子树中继续搜索if (cur->val < p->val && cur->val < q->val) {TreeNode* right = traversal(cur->right, p, q);// 如果在右子树中找到了符合条件的节点,则返回该节点if (right != nullptr) {return right;}}// 如果当前节点满足条件(即值介于p和q之间),则返回当前节点return cur;}
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {return traversal(root, p, q);}
};

复杂度分析

  • 时间复杂度: O(n)
  • 空间复杂度: O(n)

3、递归(精简版)

思路

代码

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {// 如果根节点的值大于p和q的值,说明p和q都在根节点的左子树中if (root->val > p->val && root->val > q->val) {// 递归调用左子树return lowestCommonAncestor(root->left, p, q);// 如果根节点的值小于p和q的值,说明p和q都在根节点的右子树中} else if (root->val < p->val && root->val < q->val) {// 递归调用右子树return lowestCommonAncestor(root->right, p, q);// 否则,根节点就是p和q的最低公共祖先} else return root;}
};

复杂度分析

  • 时间复杂度: O(n)
  • 空间复杂度: O(n)

4、迭代

思路

代码

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {while(root) {// 如果当前节点的值大于p和q的值,说明p和q都在当前节点的左子树中if (root->val > p->val && root->val > q->val) {root = root->left;// 如果当前节点的值小于p和q的值,说明p和q都在当前节点的右子树中} else if (root->val < p->val && root->val < q->val) {root = root->right;// 如果当前节点的值等于p或q的值,或者p和q分别在当前节点的左右子树中,那么当前节点就是最低公共祖先} else {return root;}}// 如果没有找到最低公共祖先,则返回nullptrreturn nullptr;}
};

复杂度分析

  • 时间复杂度: O(n)
  • 空间复杂度: O(1)

相关文章:

LeetCode 235. 二叉搜索树的最近公共祖先

LeetCode 235. 二叉搜索树的最近公共祖先 1、题目 题目链接&#xff1a;235. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表…...

基于ASN.1的RSA算法公私钥存储格式解读

1.概述 RFC5958主要定义非对称密钥的封装语法&#xff0c;RFC5958用于替代RFC5208。非对称算法会涉及到1对公私钥&#xff0c;例如按照RSA算法&#xff0c;公钥是n和e&#xff0c;私钥是d和n。当需要将公私钥保存到文件时&#xff0c;需按照一定的格式保存。本文主要定义公私钥…...

RS2227XN功能和参数介绍及PDF资料

RS2227XN是一款模拟开关/多路复用器 品牌: RUNIC(润石) 封装: MSOP-10 描述: USB2.0高速模拟开关 开关电路: 双刀双掷(DPDT) 通道数: 2 工作电压: 1.8V~5.5V 导通电阻(RonVCC): 10Ω 功能&#xff1a;模拟开关/多路复用器 USB2.0高速模拟开关 工作电压范围&#xff1a;1.8V ~ 5…...

机器人非线性阻抗控制系统

机器人非线性控制系统本质上是一个复杂的控制系统&#xff0c;其状态变量和输出变量相对于输入变量的运动特性不能用线性关系来描述。这种系统的形成基于两类原因&#xff1a;一是被控系统中包含有不能忽略的非线性因素&#xff0c;二是为提高控制性能或简化控制系统结构而人为…...

pandas style添加表格边框,或是只添加下边框等自定义边框样式设置

添加表格边框 可以使用如下程序添加表格&#xff1a; import dataframe_image as dfi import pandas as pd import numpy as npdf pd.DataFrame(np.random.random(size(10, 5))) df_style df.style.set_properties(**{text-align: center,border-color: black,border-width…...

OpenHarmony 3GPP协议开发深度剖析——一文读懂RIL

市面上关于终端&#xff08;手机&#xff09;操作系统在 3GPP 协议开发的内容太少了&#xff0c;即使 Android 相关的学习文档都很少&#xff0c;Android 协议开发书籍我是没有见过的。可能是市场需求的缘故吧&#xff0c;现在市场上还是前后端软件开发从业人员最多&#xff0c…...

windows部署腾讯tmagic-editor02-Runtime

创建editor项目 将上一教程中的hello-world复制过来&#xff0c;改名hello-editor 创建runtime项目 和hello-editor同级 pnpm create vite删除src/components/HelloWorld.vue 按钮需要用的ts types依赖 pnpm add tmagic/schema tmagic/stage实现runtime 将hello-editor中…...

“分块”算法的基本要素及 build() 函数的构建细节

【“分块”算法知识点】 ● 分块是用线段树的分区思想改良的暴力法。代码比线段树简单。效率比普通暴力法高。分块适合求解 m=n=10^5 规模的问题,或 m*sqrt(n)≈10^7 的问题。其中,n 为元素个数,m 为操作次数。 ● “分块”算法的基本要素 (1)块的大小用 block 表示。通常…...

畅捷通TPlus keyEdit.aspx、KeyInfoList.aspx SQL注入漏洞复现

前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 一、产…...

Ubuntu22 下配置 Qt5 环境

1. Qt 简介 Qt5 中的新功能&#xff0c;可以看到各个版本的情况Whats New in Qt 5 | Qt 5.15 Qt 源文件网址Index of /archive/qt 2. 安装 Qt Creator cd 到安装包所在目录&#xff0c;进行软件安装。赋予可执行权限&#xff0c;加上 sudo 权限进入安装&#xff0c;这样会安…...

普通人也能创业!轻资产短视频带货项目,引领普通人实现创业梦想

在这个信息爆炸的时代&#xff0c;创业似乎成为了越来越多人的梦想。然而&#xff0c;传统的创业模式 keJ0277 往往伴随着高昂的资金投入和复杂的管理流程&#xff0c;让许多普通人望而却步。然而&#xff0c;现在有一种轻资产短视频带货项目正在悄然兴起&#xff0c;它以其低…...

【Maven】Nexus简单使用

1、安装配置介绍Nexus私服&#xff1a; 安装配置指路上一篇详细教程博客 【Maven】Nexus私服简介_下载安装_登录-CSDN博客 简单介绍原有仓库类型&#xff1a; proxy代理仓库&#xff1a;代理远程仓库&#xff0c;访问全球中央仓库或其他公共仓库&#xff0c;将资源存储在私…...

winform嵌入excel 设置父窗体分辨率不是100% 嵌入excel分辨率变成双倍大小

在WinForms应用程序中嵌入Excel时&#xff0c;遇到分辨率问题可能是由于DPI缩放导致的。Windows 10及更高版本默认启用了DPI缩放&#xff0c;以便在高分辨率显示器上显示更清晰的内容。这可能会导致嵌入的应用程序&#xff08;如Excel&#xff09;看起来变大或变小。 解决方案 …...

前端系列-4 promise与async/await与fetch/axios使用方式

背景&#xff1a; 本文介绍promise使用方式&#xff0c;以及以Promise为基础的async/await用法和fetch/axios使用方式&#xff0c;主要以案例的方式进行。 1.promise 1.1 promise介绍 javascript是单线程执行的&#xff0c;异步编程的本质是事件机制和函数回调。当执行阻塞…...

微信公众号自定义分销商城小程序源码系统 带完整的安装代码吧以及系统部署搭建教程

系统概述 微信公众号自定义分销商城小程序源码系统是一款功能强大的电商解决方案&#xff0c;它集成了商品管理、订单处理、支付接口、分销管理等多种功能。该系统支持自定义界面设计&#xff0c;商家可根据自身需求调整商城的页面布局和风格&#xff0c;打造独特的品牌形象。…...

在另外一个页面,让另外一个页面弹框显示操作(调佣公共的弹框)vue

大概意思是&#xff0c;登录弹框在另外一个页面中&#xff0c;而当前页面不存在&#xff0c;在当前页面中判断如果token不存在&#xff0c;就弹框出登录的弹框 最后一行 window.location.href … 如果当前用户已登录&#xff0c;则执行后续操作(注意此处&#xff0c;可不要)...

羊毛-百度Comate领50京东E卡

给你分享一个AI编码助手——百度Comate&#xff01;扫码参与抽红包活动&#xff0c;520宠粉&#xff01;送京东卡&#xff01;https://comate.baidu.com/?inviteCodeyysudp63 流程如下 点击&#xff1a;https://comate.baidu.com/?inviteCodeyysudp63添加链接描述 验证码…...

kafka安装部署

kafka 官网下载&#xff1a; kafka https://downloads.apache.org/kafka/3.7.0/zookeeper https://downloads.apache.org/zookeeper/ run kafkazookeeper&#xff0c;conf目录下创建zoo.cfg&#xff0c;运行bin目录下的zkServer脚本文件 kafka eagle 参考&#xff1a;htt…...

VBA直连SAP RFC 接口实例

引用依赖&#xff1a; VBA 调用 SAP API的RFC函数&#xff1a;RFC_READ_TABLE Sub A() 查询SAP表数据并输出到EXCEL&#xff0c;VBA中不区分大小写&#xff08;保存后会自动把代码、变量转换大小写&#xff09;Dim iData As Integer Dim nField As Integer Dim nData As Intege…...

2024如何挑选开放式蓝牙耳机?热门爆款熬夜整理六个点!

我以前也经常使用入耳式耳机&#xff0c;但总是会感觉耳机插在耳朵里不舒服&#xff0c;戴久了耳朵很疼&#xff0c;跑步的时候还总掉。还有在过马路的时候接电话、听音乐&#xff0c;几乎感知不到周围环境音&#xff0c;很不安全。而有了一款开放式蓝牙耳机后&#xff0c;就可…...

从物理层到数据链路:深入解析CAN总线的核心通信机制

1. CAN总线的前世今生&#xff1a;为什么我们需要它&#xff1f; 想象一下你正在组装一辆智能汽车&#xff0c;发动机、变速箱、ABS、仪表盘这些部件都需要互相"对话"。如果每个设备都用独立线路连接&#xff0c;光是布线就能让工程师崩溃。这就是CAN总线诞生的背景—…...

GKD规则分享功能:导出与导入自动化配置的实用技巧

GKD规则分享功能&#xff1a;导出与导入自动化配置的实用技巧 GKD作为一款强大的Android自动化工具&#xff0c;其规则分享功能让用户能够轻松导出和导入精心配置的自动化规则。无论是备份个人设置还是分享给朋友&#xff0c;这个功能都能大幅提升使用效率&#xff01;&#x…...

Qwen3.5-2B保姆级教程:20亿参数模型端侧部署与图文对话实操

Qwen3.5-2B保姆级教程&#xff1a;20亿参数模型端侧部署与图文对话实操 1. 模型简介 Qwen3.5-2B是阿里云推出的轻量化多模态基础模型&#xff0c;属于Qwen3.5系列的小参数版本(20亿参数)。这个模型专为低功耗、低门槛部署场景设计&#xff0c;特别适合在端侧和边缘设备上运行…...

vLLM-v0.11.0保姆级部署教程:5分钟搞定LLaMA/Qwen高速推理服务

vLLM-v0.11.0保姆级部署教程&#xff1a;5分钟搞定LLaMA/Qwen高速推理服务 你是不是也遇到过这样的烦恼&#xff1f;好不容易搞到一个不错的开源大模型&#xff0c;比如LLaMA或者Qwen&#xff0c;想部署成服务试试效果&#xff0c;结果发现速度慢得像蜗牛&#xff0c;内存占用…...

Legacy iOS Kit终极指南:让旧款iOS设备重获新生的完整解决方案

Legacy iOS Kit终极指南&#xff1a;让旧款iOS设备重获新生的完整解决方案 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-K…...

用STM32CubeMX和TMC260驱动步进电机,这份PWM频率配置指南帮你避开新手常见坑

STM32CubeMX与TMC260步进电机驱动实战&#xff1a;PWM频率配置的黄金法则 第一次用STM32CubeMX配置TMC260驱动步进电机时&#xff0c;我盯着屏幕上那一堆定时器参数发愣——Prescaler、Period、Counter Mode...这些看似简单的数字背后&#xff0c;藏着让电机平稳运转或是疯狂抖…...

探索光伏 - 电池充电模型:稳定直流输出电压的技术之旅

光伏-电池充电模型&#xff0c;可以很好的稳定直流输出电压 采用最大功率跟踪MPPT算法&#xff0c;通过boost电路输出电压&#xff0c;电池侧采用电压电流PI双闭环控制&#xff0c;通过双向电路给电池充放电 直流侧参考电压为48v在光伏能源领域&#xff0c;确保稳定的直流输出电…...

Graphormer多场景教程:学术论文配图生成、课程教学演示、项目原型开发

Graphormer多场景教程&#xff1a;学术论文配图生成、课程教学演示、项目原型开发 1. 认识Graphormer模型 Graphormer是一种基于纯Transformer架构的图神经网络&#xff0c;专门为分子图&#xff08;原子-键结构&#xff09;的全局结构建模与属性预测而设计。这个模型在OGB、…...

JAVA重点基础、进阶知识及易错点总结(13)File 类 + 路径操作

&#x1f680; Java 巩固进阶 第13天 主题&#xff1a;File 类 路径操作 —— IO 体系的第一块基石&#x1f4c5; 进度概览&#xff1a;从今天起&#xff0c;我们正式进入 Java IO 流体系。第一站&#xff1a;java.io.File。 &#x1f4a1; 核心价值&#xff1a; 文件操作基石…...

3个极简功能让时间管理者实现高效时间规划:Catime计时器全场景应用指南

3个极简功能让时间管理者实现高效时间规划&#xff1a;Catime计时器全场景应用指南 【免费下载链接】Catime A tiny (995KB) but mighty timer in pure C. Supports clock, countdown, stopwatch, Pomodoro, and fully customizable tray animations (GIFs, CPU/Mem%)&#x1f…...