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

LeetCode题练习与总结:二叉树的最近公共祖先--236

一、题目描述

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

示例 1:

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

示例 2:

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

示例 3:

输入:root = [1,2], p = 1, q = 2
输出:1

提示:

  • 树中节点数目在范围 [2, 10^5] 内。
  • -10^9 <= Node.val <= 10^9
  • 所有 Node.val 互不相同 。
  • p != q
  • p 和 q 均存在于给定的二叉树中。

二、解题思路

  1. 如果当前节点为空,或者当前节点是 p 或 q 中的一个,那么返回当前节点。
  2. 递归地在左子树中查找 p 和 q 的最近公共祖先。
  3. 递归地在右子树中查找 p 和 q 的最近公共祖先。
  4. 如果左子树和右子树中分别找到了 p 和 q,那么当前节点就是最近公共祖先。
  5. 如果只在左子树中找到了 p 和 q 中的一个或两个,那么最近公共祖先一定在左子树中,返回左子树的查找结果。
  6. 如果只在右子树中找到了 p 和 q 中的一个或两个,那么最近公共祖先一定在右子树中,返回右子树的查找结果。

三、具体代码

class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {// 如果当前节点为空,或者当前节点是 p 或 q,直接返回当前节点if (root == null || root == p || root == q) {return root;}// 递归地在左子树中查找 p 和 q 的最近公共祖先TreeNode left = lowestCommonAncestor(root.left, p, q);// 递归地在右子树中查找 p 和 q 的最近公共祖先TreeNode right = lowestCommonAncestor(root.right, p, q);// 如果左子树和右子树中分别找到了 p 和 q,那么当前节点就是最近公共祖先if (left != null && right != null) {return root;}// 如果只在左子树中找到了 p 和 q,那么最近公共祖先一定在左子树中if (left != null) {return left;}// 如果只在右子树中找到了 p 和 q,那么最近公共祖先一定在右子树中return right;}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 单次访问节点:对于树中的每个节点,我们最多只会访问它一次。在递归函数中,每个节点都会被访问一次,然后它的子节点会被递归地访问。

  • 递归深度:在最坏的情况下,递归的深度会达到树的高度。在二叉树中,最坏情况是树退化成一条链,此时递归深度为 n(n 是树中节点的数量)。

因此,时间复杂度是 O(n),其中 n 是树中节点的数量。

2. 空间复杂度
  • 递归调用栈:由于递归的特性,在递归过程中,函数调用栈会保存每一层递归的信息。在最坏情况下,递归的深度会达到树的高度。

  • 递归深度与空间复杂度的关系:在最坏的情况下,如果树是一条链,那么递归的深度就是 n,此时递归调用栈将占用 O(n) 的空间。

因此,空间复杂度是 O(n),其中 n 是树中节点的数量。

综上所述:

  • 时间复杂度:O(n),因为每个节点最多被访问一次。
  • 空间复杂度:O(n),因为递归调用栈在最坏情况下可能达到 n 的深度。

五、总结知识点

  • 递归

    • 递归是一种常用的算法设计方法,它允许函数调用自身来解决问题。
    • 在这个代码中,递归用于遍历二叉树并查找两个节点的最近公共祖先。
  • 二叉树遍历

    • 代码通过递归实现了二叉树的遍历,具体是后序遍历(先访问左右子节点,再访问根节点)。
    • 遍历过程中,如果找到了 p 或 q 节点,则递归函数会返回该节点。
  • 逻辑判断

    • 代码包含了多个 if 语句,用于判断递归函数返回的节点是否为空,从而确定最近公共祖先的位置。
  • 树的结构

    • 代码操作的数据结构是二叉树,树中的每个节点包含值(val)、左子节点(left)和右子节点(right)。
  • 最近公共祖先的定义

    • 代码实现了一个基于最近公共祖先定义的算法,即对于两个节点 p 和 q,找到它们在二叉树中的最低(最深的)共同祖先。
  • 边界条件处理

    • 代码首先检查了边界条件,即当前节点是否为空或等于 p 或 q,这确保了递归的基本情况。
  • 递归与回溯的结合

    • 在递归过程中,通过回溯(递归返回)的方式,将子树中的信息传递给父节点,以便在父节点做出决策。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

相关文章:

LeetCode题练习与总结:二叉树的最近公共祖先--236

一、题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也…...

uni-app 多环境配置

前后端分离模式下&#xff0c;不同的环境如开发环境&#xff08;dev&#xff09;、测试环境&#xff08;test&#xff09;、生产环境&#xff08;prod&#xff09;等&#xff0c;不同环境后端数据库、api地址等可能都不同 。 uni-app中只有development和production两个环境 以配…...

【d48】【Java】【力扣】LCR 123. 图书整理 I

思路 方法1&#xff1a;放进list,将list倒置&#xff0c;利用stream&#xff0c;将list改为int类型 方法2&#xff1a;递归&#xff1a;递归通用思路&#xff1b;明确每一层做什么确定返回值确定什么地方接收下层的返回值 每一层&#xff1a;调用下层&#xff0c;然后把自己…...

【MySQL】InnoDB 索引为什么使用B+树而不用跳表?

在MySQL中&#xff0c;为了加速查询&#xff0c;使用B树来构建索引&#xff0c;将查询性能从O(n)优化到O(log n)。虽然跳表同样提供O(log n)的查询效率并且实现相对简单&#xff0c;但B树更适合MySQL的索引使用&#xff0c;原因包括&#xff1a; B树和跳表的区别 B树和跳表的…...

【学习笔记】TLS/SSL握手之Records

TLS / SSL会话是由记录&#xff08;Records&#xff09;所组成&#xff0c;有4种records HandshakeAlertChange Cipher SpecApplication DataHandshake和Alert Records被分为子类型&#xff08;Subtypes&#xff09;&#xff1a; Handshake&#xff1a;Client HelloHandshake&a…...

【MySQL】创建新账号新数据库并授权

在 MySQL 中创建一个名为 new_user 的用户&#xff0c;并设置密码为 new_pass&#xff0c;然后创建一个名为 new_db 的数据库&#xff0c;并将该数据库的所有权限授予 new_user 用户。 登录 MySQL&#xff1a; mysql -u root -p创建用户&#xff1a; CREATE USER new_userlo…...

Nginx反向代理简介,作用及配置;Nginx负载均衡简介,作用及配置;

一&#xff0c;Nginx反向代理 1.1简介 反向代理服务器位于用户与目标服务器之间&#xff0c;但是对于用户而言&#xff0c;反向代理服务器就相当于目标服务器&#xff0c;即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时&#xff0c;用户不需要知道目标服务器的…...

SAP MIGO M7146不支持移动原因

移动类型 Z91 查看配置&#xff1a;Z91 匹配的原因没有921 倒是Z92的原因里面有921 那解决方案有2种&#xff0c;但是要根据具体业务要求来 1、审视一下是否移动原因用错了 &#xff1f;换一个移动原因 2、确实是这个移动类型 要用到这个移动原因 &#xff0c;那就在上图 移…...

vue使用PDF.JS踩的坑--部署到服务器上显示pdf.mjs viewer.mjs找不到资源

之前项目使用的pdf.js 是2.15.349版本&#xff0c;最近换了一个4.6.82的版本&#xff0c;在本地上浏览文件运行的好好的&#xff0c;但是发布到服务器&#xff08;IIS&#xff09;上打不开文件&#xff0c;控制台提示找不到pdf.mjs viewer.mjs。 之前使用的2.15.349pdf和viewer…...

重型工程车辆数据集

重型工程车辆数据集&#xff0c;内含Bull_dozer&#xff08;推土机&#xff09;, Dumb_truck&#xff08;卡车&#xff09;, Excavator&#xff08;挖掘机&#xff09;, Grader&#xff08;平地机&#xff09;, Loader&#xff08;转载机&#xff09;, Mobile_crane&#xff08…...

【Kubernetes】常见面试题汇总(三十三)

目录 85.简述 kube-proxy 的三种工作模式和原理。 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。 题目 69-113 属于【Kubernetes】的生产应用题。 85.简述 kub…...

ubuntu安装无线网卡驱动(非虚拟机版)

本文不是基于虚拟机&#xff0c;是双系统 太夸张了 实验室居然没网线 只有一个师兄留下来的无线网卡 装完了ubuntu结果没网 make都用不了 然后搜了下大概发现是没有预装gcc和make 参考如下 https://zhuanlan.zhihu.com/p/466440088 https://wwsk.lanzouj.com/iAj4t2ao46zc…...

保障电气安全的电气火灾监控系统主要组成有哪些?

电气火灾是什么&#xff1f; 电气火灾一般是指由于电气线路、用电设备、器具以及供配电设备出现故障性释放的热能&#xff1a;如高温、电弧、电火花以及非故障性释放的能量&#xff1b;如电热器具的炽热表面&#xff0c;在具备燃烧条件下引燃本体或其他可燃物而造成的火灾&…...

gitlab集成CI/CD,shell方式部署

目录 1.首先安装好gitlab和gitlab-runner&#xff0c;这两个&#xff0c;看我以往的教程 2.注册新的 Runner 3. 步骤 3.1 Enter the GitLab instance URL (for example, https://gitlab.com/): 3.2 Enter the registration token: 3.3 Enter a description for the runner: 3…...

UE学习篇ContentExample解读-----------Blueprint_Mouse_Interaction

文章目录 总览描述&#xff08;Blueprint_Mouse_Interaction&#xff09;阅览解析1、PlayerControler分析2、拖拽球蓝图分析&#xff1a;3、移动的立方体分析&#xff1a; 新概念总结致谢&#xff1a; 总览描述&#xff08;Blueprint_Mouse_Interaction&#xff09; 打开关卡后…...

得物App荣获新奖项,科技创新助力高质量发展

近日&#xff0c;备受瞩目的2024中国国际服务贸易交易会&#xff08;简称“服贸会”&#xff09;在北京盛大开幕&#xff0c;这一全球唯一的国家级、国际性、综合型服务贸易盛会再次汇聚了全球服务贸易领域的精英与前沿成果。服贸会由商务部和北京市政府携手打造&#xff0c;并…...

傅里叶变换(对称美)

傅里叶变换&#xff08;对称美&#xff09; 冲浪时发现的有趣文章&#xff0c;学习自https://zhuanlan.zhihu.com/p/718139299 摘下来的内容&#xff1a; 傅里叶变换之所以“怪美的嘞”&#xff0c;根本在于它有一种内在的对称性&#xff0c;这一点在上面的图并没有表现出来…...

基于单片机与 PC 机通信的数据采集控制系统设计

摘 要 : 设计出基于单片机与 PC 机通信的数据采集控制系统方法 。 被控对象经传感器 、 电压变换电路 、 A/D 转换芯片与单片机相连, 可将现场参数信息传送至单片机 ; 单片机经继电器驱动控制被控对象运行 。 单片机与 PC 机经电平转换芯片相连, 实现远程通信功能 。…...

MyBatis参数处理

MyBatis 参数处理详解 在 MyBatis 中&#xff0c;参数处理是非常重要的部分&#xff0c;它支持灵活的参数传递方式&#xff0c;以实现与数据库的交互。MyBatis 提供了多种方式来传递参数&#xff0c;包括单个参数、多参数、Java 对象和集合等&#xff0c;这些参数通过 SQL 语句…...

Beyond 5.5旗舰版和高级版激光软件

Beyond 5.5旗舰版和高级版激光软件具有以下一些特点和功能&#xff1a; 1. 强大的功能特性&#xff1a; • 多媒体支持&#xff1a;它是真正的多媒体控制激光软件&#xff0c;除支持基本的激光图案外&#xff0c;还支持视频、3D 动画和绘图程序等&#xff0c;为用户提供了丰富…...

JetBrains IDE试用期重置插件:简单三步恢复30天完整功能

JetBrains IDE试用期重置插件&#xff1a;简单三步恢复30天完整功能 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 还在为JetBrains IDE试用期到期而烦恼吗&#xff1f;ide-eval-resetter插件是你需要的终极解决…...

puma-dev与Webpack Dev Server集成:解决混合内容错误的终极方案

puma-dev与Webpack Dev Server集成&#xff1a;解决混合内容错误的终极方案 【免费下载链接】puma-dev A tool to manage rack apps in development with puma 项目地址: https://gitcode.com/gh_mirrors/pu/puma-dev 在现代Web开发中&#xff0c;puma-dev作为一款快速、…...

LongWriter实战教程:从零开始构建你的专属写作AI

LongWriter实战教程&#xff1a;从零开始构建你的专属写作AI 【免费下载链接】LongWriter [ICLR 2025] LongWriter: Unleashing 10,000 Word Generation from Long Context LLMs 项目地址: https://gitcode.com/gh_mirrors/lo/LongWriter LongWriter是一款基于长上下文L…...

从YOLOv5到昇腾NPU:一份避坑无数的PyTorch模型迁移实战笔记(含性能调优)

从YOLOv5到昇腾NPU&#xff1a;一份避坑无数的PyTorch模型迁移实战笔记&#xff08;含性能调优&#xff09; 去年接手一个工业质检项目时&#xff0c;客户要求在昇腾NPU上部署YOLOv5模型。本以为只是简单的环境适配&#xff0c;没想到从驱动安装到性能调优&#xff0c;整整踩了…...

YOLOv8铁轨轨道缺陷识别检测系统(项目源码+YOLO数据集+模型权重+UI界面+python+深度学习+环境配置)

摘要 针对铁轨表面缺陷自动化检测需求&#xff0c;本研究构建了基于YOLOv8的实时检测系统&#xff0c;涵盖Spalling&#xff08;剥落&#xff09;、Wheel Burn&#xff08;车轮烧伤&#xff09;、Squat&#xff08;轨头压溃&#xff09;和Corrugation&#xff08;波浪磨耗&…...

手把手教你用LwIP RAW API在STM32上实现一个能自动重连的TCP客户端

基于LwIP RAW API的STM32 TCP客户端自动重连实战指南 在物联网终端设备开发中&#xff0c;网络连接的稳定性直接决定了产品的可靠性。想象一下&#xff0c;一个部署在工厂车间的环境监测设备&#xff0c;如果因为Wi-Fi信号波动导致数据中断&#xff0c;可能让整个生产线失去关键…...

别再只盯着增益了!用Cadence仿真两级比较器,手把手教你搞定噪声、失调和延时

两级比较器Cadence仿真实战&#xff1a;从噪声分析到延时优化的全流程指南 在模拟IC设计领域&#xff0c;比较器作为信号链中的关键模块&#xff0c;其性能直接影响整个系统的精度与响应速度。传统教材往往聚焦于比较器的理论推导&#xff0c;却鲜少提供可落地的仿真验证方法。…...

英雄联盟个性化工具终极指南:3分钟免费打造专属游戏身份

英雄联盟个性化工具终极指南&#xff1a;3分钟免费打造专属游戏身份 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 想要在英雄联盟中展示与众不同的个人资料吗&#xff1f;LeaguePrank是一款开源免费的英雄联盟个性化工具&am…...

技术从业者的情绪管理:如何应对工作压力和职业焦虑

一、软件测试从业者的情绪困境&#xff1a;压力源与焦虑画像在敏捷开发与DevOps模式深度普及的今天&#xff0c;软件测试早已不是传统意义上的“事后把关”&#xff0c;而是贯穿需求分析、代码开发、上线运维全流程的质量核心环节。这种角色转变&#xff0c;也让测试从业者面临…...

Agent+可穿戴设备:心率、睡眠、活动数据如何变成有价值的健康建议

可穿戴设备每天都会产生心率、睡眠、步数、活动强度等数据&#xff0c;但开发者真正要解决的不是“采集更多指标”&#xff0c;而是把这些指标转成可解释、可追踪、可配置的健康提示。本文从工程角度搭建一个简化版 Agent 服务&#xff0c;演示如何完成数据接入、趋势计算、规则…...