leetcode hot100【LeetCode 236.二叉树的最近公共祖先】java实现

LeetCode 236.二叉树的最近公共祖先

题目描述

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

节点可以表示为它在树中的路径,其中路径的第一个节点是根节点,每个后续节点是其父节点的直接子节点。

示例 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 = 2, q = 0
输出: 1
解释: 节点 2 和 0 的最近公共祖先是 1,因为 0 是 2 的父节点。

Java 实现代码

class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if (root == null || root == p || root == q) {return root;}TreeNode left = lowestCommonAncestor(root.left, p, q);TreeNode right = lowestCommonAncestor(root.right, p, q);if (left != null && right != null) {return root;}return left != null ? left : right;}
}

解题思路

递归法:

  • 从根节点开始递归搜索。
  • 如果当前节点为 null,返回 null
  • 如果当前节点为 pq,返回当前节点。
  • 递归搜索左右子树:
    • 如果左右子树都能找到目标节点,则当前节点为最近公共祖先。
    • 如果只有一侧子树能找到目标节点,则返回该子树的结果。

复杂度分析

  • 时间复杂度:O(n),其中 n 是树中的节点数。在最坏的情况下,我们需要访问树中的每个节点。
  • 空间复杂度:O(h),其中 h 是树的高度。这是因为在递归过程中,我们可能会有多达 h 层的函数调用栈,这发生在树完全不平衡时,所有节点都在一个单独的链上。

示例 树结构:

    3/ \5   1/ \  / \
6  2 0  8/ \7   4 ```
输入: p = 4, q = 8
递归执行过程:
  1. 根节点 3

    • 检查当前节点是否为 nullpq3 不是 48
    • 递归左子树 root.left = 5
  2. 节点 5

    • 检查当前节点是否为 nullpq5 不是 48
    • 递归左子树 root.left = 6
  3. 节点 6

    • 检查当前节点是否为 nullpq6 不是 48
    • 递归左子树 root.left = null,返回 null
    • 递归右子树 root.right = null,返回 null
    • 左右子树返回均为 null,返回 null
  4. 返回节点 5,递归右子树 root.right = 2

  5. 节点 2

    • 检查当前节点是否为 nullpq2 不是 48
    • 递归左子树 root.left = 7
  6. 节点 7

    • 检查当前节点是否为 nullpq7 不是 48
    • 递归左子树 root.left = null,返回 null
    • 递归右子树 root.right = null,返回 null
    • 左右子树返回均为 null,返回 null
  7. 返回节点 2,递归右子树 root.right = 4

  8. 节点 4

    • 当前节点为 p = 4,直接返回当前节点 4
  9. 返回节点 2,左子树返回 null,右子树返回 4,返回 4

  10. 返回节点 5,左子树返回 null,右子树返回 4,返回 4

  11. 返回节点 3,递归右子树 root.right = 1

  12. 节点 1

  • 检查当前节点是否为 nullpq1 不是 48
  • 递归左子树 root.left = 0
  1. 节点 0
  • 检查当前节点是否为 nullpq0 不是 48
  • 递归左子树 root.left = null,返回 null
  • 递归右子树 root.right = null,返回 null
  • 返回 null
  1. 返回节点 1,递归右子树 root.right = 8

  2. 节点 8

  • 当前节点为 q = 8,直接返回当前节点 8
  1. 返回节点 1,左子树返回 null,右子树返回 8,返回 8

  2. 返回节点 3,左子树返回 4,右子树返回 8

    • 左右子树均非 null,所以 3 是最近公共祖先。

结果: p = 4q = 8 的最近公共祖先是 3

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

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

相关文章

【云原生系列--Longhorn的部署】

Longhorn部署手册 1.部署longhorn longhorn架构图: 1.1部署环境要求 kubernetes版本要大于v1.21 每个节点都必须装open-iscsi ,Longhorn依赖于 iscsiadm主机为 Kubernetes 提供持久卷。 apt-get install -y open-iscsiRWX 支持要求每个节点都安装 N…

【Hadoop】【hdfs】【大数据技术基础】实验三 HDFS 基础编程实验

实验三: HDFS Java API编程实践 实验题目 HDFS Java API编程实践 实验目的 熟悉HDFS操作常用的Java API。 实验平台 操作系统:Linux Hadoop版本:2.6.0或以上版本 JDK版本:1.6或以上版本 Java IDE:Eclipse 实验…

ssm114基于SSM框架的网上拍卖系统的设计与实现+vue(论文+源码)_kaic

摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势,商品拍卖当然也不能排除在外,随着商品拍卖管理的不断成熟,它彻底改变了过去传统的经营管理方式,不仅使商品…

Transformer中的算子:其中Q,K,V就是算子

目录 Transformer中的算子 其中Q,K,V就是算子 一、数学中的算子 二、计算机科学中的算子 三、深度学习中的算子 四、称呼的由来 Transformer中的算子 其中Q,K,V就是算子 “算子”这一称呼源于其在数学、计算机科学以及深度学习等多个领域中的广泛应用和特定功能。以下是…

厦大南洋理工最新开源,一种面向户外场景的特征-几何一致性无监督点云配准方法

导读 本文提出了INTEGER,一种面向户外点云数据的无监督配准方法,通过整合高层上下文和低层几何特征信息来生成更可靠的伪标签。该方法基于教师-学生框架,创新性地引入特征-几何一致性挖掘(FGCM)模块以提高伪标签的准确…

生产环境中AI调用的优化:AI网关高价值应用实践

随着越来越多的组织将生成式AI引入生产环境,他们面临的挑战已经超出了初步实施的范畴。如果管理不当,扩展性限制、安全漏洞和性能瓶颈可能会阻碍AI应用的推广。实际问题如用户数据的安全性、固定容量限制、成本管理和延迟优化等,需要创新的解…

Redis 概 述 和 安 装

安 装 r e d i s: 1. 下 载 r e dis h t t p s : / / d o w n l o a d . r e d i s . i o / r e l e a s e s / 2. 将 redis 安装包拷贝到 /opt/ 目录 3. 解压 tar -zvxf redis-6.2.1.tar.gz 4. 安装gcc yum install gcc 5. 进入目录 cd redis-6.2.1 6. 编译 make …

SpringBoot 2.2.10 无法执行Test单元测试

很早之前的项目今天clone现在,想执行一个业务订单的检查,该检查的代码放在test单元测试中,启动也是好好的,当点击对应的方法执行Test的时候就报错 tip:已添加spring-boot-test-starter 所以本身就引入了junit5的库 No…

[项目代码] YOLOv5 铁路工人安全帽安全背心识别 [目标检测]

YOLOv5是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv5具有更高的…

SIM Jacker攻击分析

简介: 2019年9月12日,AdaptiveMobile Security公布了一种针对SIM卡ST Browser的远程攻击方式:Simjacker。攻击者使用普通手机发送特殊构造的短信即可远程定位目标,危害较大 。sim卡的使用在手机上的使用非常普遍,所以…

【linux】centos7 换阿里云源

相关文章 【linux】CentOS 的软件源(Repository)学习-CSDN博客 查看yum配置文件 yum的配置文件通常位于/etc/yum.repos.d/目录下。你可以使用以下命令查看这些文件: ls /etc/yum.repos.d/ # 或者 ll /etc/yum.repos.d/备份当前的yum配置文…

AI 写作(八)实战项目一:自动写作助手(8/10)

一、项目背景与需求分析 (一)写作需求的多样化 在互联网普及的今天,人们对写作的需求呈现出前所未有的多样化态势。无论是学术论文、新闻报道,还是社交媒体的动态更新、网络小说的创作,都离不开高质量的写作。以学术研…

微信小程序内嵌h5页面(uniapp写的),使用uni.openLocation无法打开页面问题

1.问题 微信小程序内嵌h5页面(uniapp写的),使用uni.openLocation打开地图页面后,点击该页面下方“到这里”按钮,显示无法打开。如下图: 3.解决方案 在内嵌h5中不使用uniapp的api打开地图,而在h5页面事件处理程序中去跳转新的小程序页面,在该新页面去使用微信小程序…

SpringCloud核心组件(五)

文章目录 Gateway一. 概述简介1. Gateway 是什么2. 什么是网关?3.Gateway 和 Nginx 两个网关的区别什么是流量入口? 4.Gateway 能干嘛5.gateway 三大核心概念6.运行方式 二. 入门案例a.创建gateway模块,在pom.xml中引入依赖b.创建启动类GatewayApplicat…

1+X应急响应(网络)系统备份:

系统备份: 系统备份概述: 备份种类: 灾难恢复等级划分: 执行一次备份: 创建备份计划: 恢复备份:

Python学习26天

集合 # 定义集合 num {1, 2, 3, 4, 5} print(f"num:{num}\nnum数据类型为:{type(num)}") # 求集合中元素个数 print(f"num中元素个数为:{len(num)}") # 增加集合中的元素 num.add(6) print(num) # {1,2,3,4,5,6} # 删除…

git撤销、回退某个commit的修改

文章目录 撤销某个特定的commit方法 1:使用 git revert方法 2:使用 git rebase -i方法 3:使用 git reset 撤销某个特定的commit 如果你要撤销某个很早之前的 commit,比如 7461f745cfd58496554bd672d52efa8b1ccf0b42,可…

《译文》2024年11月数维杯国际大学生数学建模挑战赛题目

# 赛题正式发布 2024年第十届数维杯国际大学生数学建模挑战赛顺利开赛,竞赛开始时间为北京时间2024年11月15日09:00至北京时间2024年11月19日09:00,共计4天,竞赛题目正式发布,快来一起围观,你认为今年的哪个题目更具有…

LabVIEW 使用 Snippet

在 LabVIEW 中,Snippet(代码片段) 是一个非常有用的功能,它允许你将 一小段可重用的代码 保存为一个 图形化的代码片段,并能够在不同的 VI 中通过拖放来使用。 什么是 Snippet? Snippet 就是 LabVIEW 中的…

【苍穹外卖】学习日志-day1

目录 nginx 反向代理介绍 nginx 的优势 提高访问速度 负载均衡 保证后端服务安全 高并发静态资源 Swagger 生成 API 文档 Swagger 的使用方式 导入knife4j的maven坐标 在配置类中加入knife4j相关配置 设置静态资源映射 通过注解控制生成的接口文档 项目技术点 Token 模式 MD5 加…