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…

跟李笑来学美式俚语(Most Common American Idioms): Part 02

Most Common American Idioms: Part 02 前言 本文是学习李笑来的Most Common American Idioms这本书的学习笔记,自用。 Github仓库链接:https://github.com/xiaolai/most-common-american-idioms 使用方法: 直接下载下来(或者clone到本地…

Molecular signatures database (MSigDB) 3.0

文献翻译和解读(解读在最后) 摘要 动机: 良好注释的基因集代表了生物学过程的全貌,对于大规模基因组数据的有意义和深入解读至关重要。分子特征数据库(MSigDB)是最广泛使用的此类基因集资源库之一。 结果…

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

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

Flowable 构建后端服务(后端以及数据库搭建) Flowable Modeler 设计器搭建(前端)

案例地址&#xff1a;xupengboo-flowable-example Flowable 构建后端服务&#xff08;后端以及数据库搭建&#xff09; 以 Spring Boot 项目为例&#xff1a; 引入 Flowable 必要依赖。 <!-- flowable 依赖 --> <dependency><groupId>org.flowable</gr…

2022 年 9 月青少年软编等考 C 语言二级真题解析

目录 T1. 统计误差范围内的数思路分析 T2. 全在其中思路分析 T3. Lab 杯思路分析 T4. 有趣的跳跃思路分析 T5. 反反复复思路分析 T1. 统计误差范围内的数 统计一个整数序列中与指定数字 m m m 误差范围小于等于 x x x 的数的个数。 时间限制&#xff1a;1 s 内存限制&#…

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

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

智慧农业的前世今生

智慧农业是将现代信息技术与传统农业相结合的新型农业生产方式&#xff0c;其发展历程如下&#xff1a; 20世纪70年代末&#xff0c;以美国为代表的欧美国家率先开始农业信息化、智能化的应用研究&#xff0c;以农业专家系统为代表的农业信息化应用开始在农业生产领域萌芽。我…

BERT模型核心组件详解及其实现

摘要 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一种基于Transformer架构的预训练模型&#xff0c;在自然语言处理领域取得了显著的成果。本文详细介绍了BERT模型中的几个关键组件及其实现&#xff0c;包括激活函数、变量初始化…

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

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

ElementPlus el-upload上传组件on-change只触发一次

ElementPlus el-upload上传组件on-change只触发一次 主要运用了:on-exceed方法 废话不多说&#xff0c;直接上代码 <el-uploadclass"avatar-uploader"action"":on-change"getFilesj":limit"1":auto-upload"false"accep…

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

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

Conda环境与Ubuntu环境移植详解

Conda环境与Ubuntu环境移植详解 在计算机科学中&#xff0c;环境迁移是一项常见的任务&#xff0c;特别是对于使用Anaconda等工具进行数据科学和机器学习的开发人员。迁移环境不仅能够帮助开发者在不同设备间无缝切换&#xff0c;还能确保项目依赖的一致性&#xff0c;从而避免…

【深度学习基础】PyCharm anaconda PYTorch python CUDA cuDNN 环境配置

这里写目录标题 PyCharm 安装anaconda安装PYTorch安装确定python版本CUDA安装cuDNN安装检验环境是否配置成功参照:PyCharm 安装 官网下载 anaconda安装 官网下载 :https://www.anaconda.com/download 配置环境变量,增加 D:\WorkSoftware\Install\Anaconda3 D:\WorkSoftw…

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

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

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现在&#xff0c;想执行一个业务订单的检查&#xff0c;该检查的代码放在test单元测试中&#xff0c;启动也是好好的&#xff0c;当点击对应的方法执行Test的时候就报错 tip&#xff1a;已添加spring-boot-test-starter 所以本身就引入了junit5的库 No…

Dubbo 3.2 源码导读

Dubbo 是一个高性能的 Java RPC 框架&#xff0c;广泛用于构建分布式服务。Dubbo 3.2 版本引入了一些新的特性和改进&#xff0c;是一个值得深入研究的版本。以下是对 Dubbo 3.2 源码的导读&#xff0c;帮助你理解其架构和设计。 1. 源码获取 从 GitHub 上获取 Dubbo 3.2 的源…

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

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

Flutter:Widget生命周期

StatelessWidget&#xff1a;无状态部件的生命周期 import package:flutter/material.dart;void main() {runApp(App()); }class App extends StatelessWidget {overrideWidget build(BuildContext context) {return MaterialApp(home: MyHomePage(title: MyHome),);} }class M…