[LeetCode][LCR 194]二叉树的最近公共祖先

题目

LCR 194. 二叉树的最近公共祖先

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

例如,给定如下二叉树:
root = [3,5,1,6,2,0,8,null,null,7,4]
在这里插入图片描述

  • 示例 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。因为根据定义最近公共祖先节点可以为节点本身。

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

注意:本题与主站 236 题相同:LeetCode - Lowest Common Ancestor of a Binary Tree

解法

  1. 这题与 LCR193 的不同之处在于其不是二叉搜索树,故不能简单地用节点的大小值比较来找到目标节点,进而找到最近公共祖先
  2. 对可能的公共祖先进行分析,p/q可能就是最近的公共祖先,如下图,1 和 3 最近的公共祖先就是1
    在这里插入图片描述
  3. 公共祖先也可能是根,如下图,目标节点 2 和 3 分布在 1 两侧,最近公共祖先就是 1
    在这里插入图片描述
  4. 进行前序遍历,从顶至下,当找到第一个目标节点时就返回,由于是从顶往下找,第二个目标节点可能在第一个目标节点的下面,也可能在第一个目标节点的异侧
  5. 找到了第一个目标节点后,立刻返回,然后在目标节点的根的另一侧寻找第二个目标节点,如果找不到,则说明第二个目标节点和第一个目标节点在同一个子树上,所以最近公共祖先就是第一个目标节点。(比如下图,目标节点为2、4,找到 2 后立刻返回,在 2 的根 1 的另一边子树寻找 4,发现没有找到,则 4 一定在 2 这边的子树,所以 2 就是最近的公共祖先)
    在这里插入图片描述
  6. 如果找到第一个目标节点后,在第一个目标节点的根的另一边可以找到第二个目标节点,则目标节点分布在根的两侧,此时由先序遍历可知,根就是最近的公共祖先。(比如下图,当找到第一个目标节点 2 之后,在 2 的根 1 的另一边找第二个节点 4,发现可以找到,则目标节点 2 和 4 分布在根 1 的两侧,所以根 1 就是最近的公共祖先)
    在这里插入图片描述

作者:Krahets
链接:https://leetcode.cn/leetbook/read/illustration-of-algorithm/lh5kuh/
来源:力扣(LeetCode)

class Solution {
public:
//递归返回值:空节点/最近公共祖先节点(可能是自身也可能是上一个节点)
//递归工作:在当前节点的左右子树中寻找目标节点
//递归结束条件:越过子节点/找到了目标节点

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(!root || root==p || root==q) return root;
        TreeNode *left = lowestCommonAncestor(root->left, p, q);
        TreeNode *right = lowestCommonAncestor(root->right, p, q);
        if(!left) return right;
        if(!right) return left;
        return root;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库系统概念(第二周 第一堂)

前言 本文的所有知识点、图片均来自《数据库系统概念》(黑宝书)、山东大学李晖老师PPT。不可用于商业用途转发。 回顾 上周最后一个知识点说到数据库三级模式结构,在这个结构里面我们设立了模式/内模式映像、内模式/外模式映像,主…

Python之闭包

一、概念 在函数嵌套的前提下,内层函数引用外层函数的变量(包括参数),外层函数又把内层函数当做返回值进行返回。 这个内层函数所引用的外层变量称为 “闭包” def test(): # 外层函数a 33 # 外部变量def test2(): # 内层函数print(a)return test2newFu…

网络计算机

TCP/IP四层模型 应用层:位于传输层之上,主要提供两个设备上的应用程序之间信息交换的服务,它定义了信息交换的格式,消息会交给下一层传输层来传递。我们把应用层交互的数据单元称为报文。应用层工作在操作系统的用户态&#xff0…

Android自定义view从入门到高级

简介 什么是自定义view?我认为只要不是编译器直接提供可以使用的view,都可以认为是自定义view。自定义view主要分为两大类,第一类自定义view可以通过系统提供的各种view组合,样式变化实现的view。第二类是通过继承view或者ViewGro…

捍卫数据保护:预防和缓解.mallox勒索病毒的威胁

导言: 在当今数字化时代,我们与世界各地的人们通过网络连接在一起,享受着前所未有的便利。然而,随着科技的进步,网络犯罪也在不断演变,.mallox勒索病毒便是其中之一,给无数用户带来了困扰。本文…

【SpringCloud微服务实战07】Sentinel 服务保护

Sentinel 是阿里巴巴开源的一款微服务流量控制组件。主要作用: 流量控制:避免因瞬间高并发流量而导致服务故障流。超时处理、线程隔离、降级熔断:避免因服务故障引起的雪崩问题。一、Sentinel 安装 1、安装Sentinel控制台,下载jar包并启动:Releases alibaba/Sentinel G…

【HiVT】HiVT轨迹预测代码环境配置及训练

0.简介 github项目链接 论文链接 Argoverse 1.1验证集的预期性能是: Models minADE minFDE MR HiVT-64 0.69 1.03 0.10 HiVT-128 0.66 0.97 0.09 1. 拉取代码仓库 git clone https://github.com/ZikangZhou/HiVT.git cd HiVT2. 创建conda环境 conda create -n H…

Java 启动参数 -- 和 -D写法的区别

当我们配置启动1个java 项目通常需要带一些参数 例如 -Denv uat , --spring.profiles.activedev 这些 那么用-D 和 – 的写法区别是什么? 双横线写法 其中这种写法基本上是spring 和 spring 框架独有 最常用的无非是就是上面提到的 --spring.profiles.activede…

LiveGBS流媒体平台GB/T28181功能-海康摄像头国标语音对讲大华摄像头国标语音对讲GB28181语音对讲需要的设备及服务准备

LiveGBS海康摄像头国标语音对讲大华摄像头国标语音对讲GB28181语音对讲需要的设备及服务准备 1、背景2、准备2.1、服务端必备条件(注意)2.2、准备语音对讲设备2.2.1、 大华摄像机2.2.1.1、 配置接入示例2.2.1.2、 配置音频通道编号 2.2.2、 海康摄像机2.…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的危险物品检测系统(深度学习模型+PySide6界面+训练数据集+Python代码)

摘要:本文深入介绍了一个采用深度学习技术的危险物品识别系统,该系统融合了最新的YOLOv8算法,并对比了YOLOv7、YOLOv6、YOLOv5等早期版本的性能。该系统在处理图像、视频、实时视频流及批量文件时,能够准确识别和分类各种危险物品…

jenkins部署go应用 基于docker

丢弃旧的的构建 github 拉取代码 拉取代码排除指定配置文件 报错 环境变量失效 服务器版本为1.21.6 但是一直没有生效

【大模型系列】根据文本检索目标(DINO/DINOv2/GroundingDINO)

文章目录 1 DINO(ICCV2021, Meta)1.1 数据增强1.2 损失函数 2 DINOv2(CVPR2023, Meta)2.1 数据采集方式2.2 训练方法 3 Grounding DINO3.1 Grounding DINO设计思路3.2 网络结构3.2.1 Feature Extraction and Enhancer3.2.2 Language-Guided Query Selection3.2.3 Cross-Modalit…

doris安装(docker方式)

背景 doris有两个进程 fe,处理用户请求,查询,元数据管理,节点管理be,数据存储,查询计划执行 架构图如下: 参考:https://doris.apache.org/zh-CN/docs/get-starting/what-is-apache-doris 1、定义docker-compose文件 version: 3 services:docker-fe:image: "apac…

2024年华为OD机试真题-两个字符串间的最短路径问题-Java-OD统一考试(C卷)

题目描述: 给定两个字符串,分别为字符串A与字符串B。例如A字符串为ABCABBA,B字符串为CBABAC可以得到下图m*n的二维数组,定义原点为(0, 0),终点为(m, n),水平与垂直的每一条边距离为1,映射成坐标系如下图。 从原点(0, 0)到(0, A)为水平边,距离为1,从(0, A)到(A, C)为垂…

10年外贸老手分享,外贸soho要怎么做

经常会有外贸老手想做辞职做soho或者外贸小白想做soho,那么soho到底要怎么怎么才能做好呢?做外贸soho大概会经过下面这6个阶段,构思阶段-草图阶段-尝试阶段-初步阶段-稳定阶段-发展阶段。 不同的阶段因为面对的问题不一样,所以也…

《JAVA与模式》之原型模式

系列文章目录 文章目录 系列文章目录前言一、原型模式的结构二、简单形式的原型模式三、登记形式的原型模式四、克隆满足的条件五、浅克隆和深克隆前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用…

Leetcode 543. 二叉树的直径

题目描述: 给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 示例 1: 输入:ro…

aardio 调用 C#程序读 Freeplane.mm文件,生成测试用例.csv文件

C# 请参阅:C# 用 System.Xml 读 Freeplane.mm文件,生成测试用例.csv文件 Freeplane 是一款基于 Java 的开源软件,继承 Freemind 的思维导图工具软件,它扩展了知识管理功能,在 Freemind 上增加了一些额外的功能&#x…

从龙珠到Cocos游戏开发中的无限循环滚动背景

引言 从龙珠到Cocos游戏开发中的无限循环滚动背景 近日,鸟山明去世的消息传来,网友们纷纷表示哀悼,这位被外交部哀悼的鸟山明或许你不熟悉,但是他的作品《龙珠》承载着一代人的记忆与青春。 **《龙珠》**作为一部向中国文化致敬的作品,笔者在刷视频时回忆了许多,当看到…

Xcode remove the package dependency

Xcode Version 15.2 (15C500b) 🤔️ 想知道直接右键,这个 Delete 为什么是禁用状态 推荐一下刚上线的 App 熊猫小账本,里面有用到这篇博客讲的内容 熊猫小账本 一个简洁的记账 App,用于记录日常消费开支收入,使用 iCl…
最新文章