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.rhkb.cn/news/471936.html

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

相关文章

医院信息化与智能化系统(21)

医院信息化与智能化系统(21) 这里只描述对应过程,和可能遇到的问题及解决办法以及对应的参考链接,并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图,可以试试PlantUML,告诉GPT你的文件结构,让他给你对应…

《FreeRTOS任务控制块篇》

Task control block, 即任务控制块。任务控制块(TCB)是一个结构体,它会分配给每个任务,其中存储着任务的状态信息,包括指向任务上下文(任务的运行时环境,包括寄存器值)的指针。任务控…

Queuing 表(buffer表)的优化实践 | OceanBase 性能优化实践

案例问题描述 该案例来自一个金融行业客户的问题:他们发现某个应用对一个数据量相对较小的表(仅包含数千条记录)访问时,频繁遇到性能下降的情况。为解决此问题,客户向我们求助进行分析。我们发现这张表有频繁的批量插…

ssh登陆服务器后支持Tab键命令补全

在服务器上新建了用户后,通过ssh登录到服务器后发现不能使用Tab键来进行命令补全 截图如下: 以为没有配置.bashrc 此时输入 source 发现无此命令 细心的可以发现 -sh 于是输入命令echo $SHELL 确认此时的shell为sh, 只要输入命令bash即可切…

[白月黑羽]关于仿写类postman功能软件题目的解答

原题: 答: python文件如下 from PySide6.QtWidgets import QApplication, QMessageBox,QTableWidgetItem,QHeaderView,QWidget,QTableWidget from PySide6.QtCore import QEvent,QObject from PySide6.QtUiTools import QUiLoader import time import …

Postman接口测试(断言、关联、参数化、输出测试报告)

基本界面展示 Get、Post请求 Postman断言 使用postman来判断预期结果与实际结果是否一致 响应状态码断言 响应包含字符串 断言判断字符串的格式 关联 用于解决http请求之间存在依赖关系 依赖:一个http请求的响应结果中的数据,被另一个请求使用 登…

【卡尔曼滤波】数据融合Fusion的应用 C语言、Python实现(Kalman Filter)

【卡尔曼滤波】数据融合Fusion的应用 C语言、Python实现(Kalman Filter) 更新以gitee为准: gitee地址 文章目录 卡尔曼滤波数据融合Python实现C语言实现多个数据如何融合附录:压缩字符串、大小端格式转换压缩字符串浮点数压缩Pac…

网络原理-网络层和数据链路层

一、网络层 1、IP协议完成的工作 地址管理:使用一套地址体系来描述所没备的位置 路由选择:一个数据包如何从网络的某个地址传到另一个地址 2、IP报头 4 位版本号:取值为4或6 (IPv4/IPv6) 4 位首部长度:IP报头,单位…

【Three.js基础学习】22.New project structure

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 这里将使用全新的项目结构,将不同工具分层,区分开使用。 一、结构目录 二、对应文件 1.script.js 获取画布,引入样式和功能。 /* 课…

AI风向标|算力与通信的完美融合,SRM6690解锁端侧AI的智能密码

当前,5G技术已经成为推动数字经济和实体经济深度融合的关键驱动力,进入5G发展的下半场,5G与AI的融合正推动诸多行业的数字化转型和创新发展,终端侧AI和端云混合式AI将广泛应用于各类消费终端和各行各业。 在推动5G和AI与各行业场…

【WPF】Prism学习(二)

Prism Commands 1.命令(Commanding) 1.1. ViewModel的作用: ViewModel不仅提供在视图中显示或编辑的数据,还可能定义一个或多个用户可以执行的动作或操作。这些用户可以通过用户界面(UI)执行的动作或操作…

智慧建造-运用Trimble技术将梦幻水族馆变为现实【上海沪敖3D】

项目概述 西雅图水族馆耗资1.6亿美元对海洋馆进行扩建。该项目包括建造三个大型栖息地,每个建筑物几乎都没有直边,其中一个主栖息地由520立方米混凝土和355吨钢筋组成。特纳建筑公司的混凝土团队通过强大的贸易合作伙伴和创新的数字制造技术,…

kubesphere环境-本地Harbor仓库+k8s集群(单master 多master)+Prometheus监控平台部署

前言:半月前在公司生产环境上离线部署了k8s集群Victoria Metrics(二开版)自研版夜莺 监控平台的搭建,下面我租用3台华为云服务器演示部署kubesphere环境-本地Harbor仓库k8s集群(单master节点 & 单master节点)Prometheus监控部…

java 随机生成验证码

1.需求 实现随机生成验证码,验证码可能是大小写字母和数字 2.实现 写一个getCode方法实现 public static String getCode(int n){//1. 定义一个字符串,字符串中包含大小写字母和数字String str "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrs…

Unity图形学之Blend指令

1.渲染流程:Blend 决定了要渲染的像素和Gbuffer里像素到底怎么取舍 2.Blend 公式: 3.factor可以取值的内容有: One 1 Zero :0 SrcColor : 要渲染的像素 SrcAlpha : 要渲染像素的 a 通道。 DstColor : 已经渲染在gbuffer…

林曦词典|养生

“林曦词典”是在水墨画家林曦的课堂与访谈里,频频邂逅的话语,总能生发出无尽的思考。那些悠然轻快的、微妙纷繁的,亦或耳熟能详的词,经由林曦老师的独到解析,意蕴无穷,让人受益。于是,我们将诸…

生成自签名证书并配置 HTTPS 使用自签名证书

生成自签名证书 1. 运行 OpenSSL 命令生成证书和私钥 在终端中输入以下命令,生成自签名证书和私钥文件: sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout self_signed.key -out self_signed.pem-x509:生成自签名证书。…

物料数据对接:轻易云助力聚水潭与金蝶云星空集成方案

聚水潭数据集成到金蝶云星空:物料对接方案 在企业信息化系统中,数据的高效流动和准确对接是业务运营的关键。本文将聚焦于一个具体的技术案例——如何通过轻易云数据集成平台实现聚水潭与金蝶云星空之间的物料数据对接。 本次集成任务主要涉及两个核心…

阅读2020-2023年《国外军用无人机装备技术发展综述》笔记_作战无人机和察打无人机图鉴

文献基本信息 题名作者来源发表时间2020年国外先进军用无人机技术发展综述 袁成;董晓琳;朱超磊 飞航导弹 2021-01-14 2021年国外军用无人机装备技术发展综述 朱超磊 ;袁成;杨佳会;飞航导弹 战术导弹技术2022-02-112022年国外军用无人机装备技术发展综述 朱超磊;金钰;王靖…