[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.mzph.cn/news/744038.shtml

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

相关文章

#微信小程序(轮播图以及开发方法)

1.IDE:微信开发者工具 2.实验:轮播图以及正确的开发方法 (1)有HTML,CSS,javascript基础即可 (2)写界面一定要查看开发手册,这是微信小程序比较好的地方,由于…

QT----基于QT的人脸考勤系统(未完成)

目录 1 编译opencv库1.1 下载源代码1.2 qt编译opencv1.3 执行Cmake一直卡着data: Download: face_landmark_model.dat 2 编译SeetaFace2代码2.1 遇到报错By not providing "FindOpenCV.cmake" in CMAKE_MODULE_PATH this project has2.2遇到报错Model missing 3 测试…

机试:成绩排名

问题描述: 代码示例: #include <bits/stdc.h> using namespace std;int main(){cout << "样例输入" << endl; int n;int m;cin >> n;int nums[n];for(int i 0; i < n; i){cin >> nums[i];}// 排序for(int i 0; i < n; i){//…

IP地址无所遁形!试试这个3k星热门开源查询神器!

在日常开发中&#xff0c;我们经常需要查询IP地址的位置信息&#xff0c;比如&#xff1a; 网站统计&#xff1a;统计用户的来源地&#xff0c;了解访问者分布情况&#xff1b;安全防护&#xff1a;根据IP地址判断用户是否来自风险地区&#xff0c;加强安全防护措施&#xff1…

13.7 Map 接口(血干JAVA系列)

这里写目录标题 13.7.1 Map接口简介13.7.2 Map.Entry接口简介13.7.3 Map接口的常用子类1.新的子类&#xff1a;HashMap2.相关操作实例(1)实例操作1——向集合中增加和取出内容【例13.26】增加和取得内容 (2)实例操作2------------ 判断指定的key或value是否存在【例13.27】判断…

VMware16如何克隆虚拟机

目录 克隆虚拟机方式一(在Windows上复制粘贴)克隆虚拟机方式二(使用VM的克隆操作 克隆之前需要关机)修改克隆机的IP和主机名虚拟机快照虚拟机的迁移和删除 克隆虚拟机方式一(在Windows上复制粘贴) 直接拷贝一份你已经安装好的虚拟机 复制到目的主机上 然后用VM就能打开它 甚至…

全视智慧机构养老解决方案,以科技守护长者安全

2024年2月28日凌晨1时许&#xff0c;在上海浦东大道的一家养护院四楼杂物间内发生了一起火灾事故。尽管火势不大&#xff0c;过火面积仅为2平方米&#xff0c;但这场小火却造成了1人死亡和3人受伤的悲剧。这一事件再次提醒我们&#xff0c;养老院作为老年人聚集的场所&#xff…

人人站CMS后台登不进去解决方案(已解决)

公司有一个网站使用的是人人站CMS&#xff0c;最近发现后台登录不进去&#xff0c;有以下报错 发生以下错误: file get contents(http://www.rrzcms.com/Public/cms/config/config.ison): failed to open stream: HTTP reguest failed! 请求的URL导致内部服务器错误。 如果您反…

win11文件共享失败的问题

前言 windows 11连接公司内部服务器报错&#xff0c;报错如下&#xff1a; 因为文件共享不安全&#xff0c;所以你不能连接到文件共享。此共享需要过时的SMB1协议&#xff0c;而此协议是不安全的&#xff0c;可能会使你的系统遭受攻击。你的系统需要SMB2或更高版本。有关如何解…

188基于matlab的AR模型参数估计

基于matlab的AR模型参数估计&#xff0c;burg法和ule-Walker法估计信号&#xff0c;并输出估计误差。程序已调通&#xff0c;可直接运行。 188 AR模型参数估计 burg法和ule-Walker法 (xiaohongshu.com)

展厅设计中灯光的要点都是什么

1、白炽灯 白炽灯也就是普通普通白炽灯泡白炽灯有显色性强&#xff0c;开灯即亮&#xff0c;明暗可调&#xff0c;结构简单&#xff0c;造价低等优点&#xff0c;但缺点是使用寿命短&#xff0c;光效较低展厅设计中常使用于走道和其他部位。 2、卤钨灯 充气白炽灯填充气体中含有…

【数理统计实验(三)】假设检验的R实现

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

【linux中cd指令使用】cd进入与退出路径

【linux中cd指令使用】cd如何进入与退出路径 1、cd进入指定路径&#xff0c;比如我要进入下面这个路径中去运行setup.py文件&#xff0c;如果我不跳转到该路径下直接运行&#xff0c;会报错找不到该文件 cd空格路径&#xff0c;即可跳转到该路径 cd /public2/xxx/tiny-cuda…

鸿蒙不再适合JS语言开发

ArkTS是鸿蒙生态的应用开发语言。它在保持TypeScript&#xff08;简称TS&#xff09;基本语法风格的基础上&#xff0c;对TS的动态类型特性施加更严格的约束&#xff0c;引入静态类型。同时&#xff0c;提供了声明式UI、状态管理等相应的能力&#xff0c;让开发者可以以更简洁、…

Pytorch入门-Transforms

文章目录 ComposeToTensorNormalizeResize 在PyTorch中&#xff0c;transforms是一个用于图像预处理和数据增强的模块&#xff0c;通常与torchvision库一起使用。torchvision提供了大量预先定义的transforms&#xff0c;它们可以方便地应用于图像数据&#xff0c;以进行预处理或…

突破内网限制,自由访问 NAS:网络穿透方案大合集! | 开源日报 No.199

anderspitman/awesome-tunneling Stars: 12.2k License: NOASSERTION awesome-tunneling 是一个列出 ngrok 替代方案和其他类似 ngrok 的隧道软件和服务的项目&#xff0c;重点是自托管。 主要面向自托管者和开发人员。提供注册域名并将记录自动指向运行隧道的服务器。自动设…

疯狂数钞票H5游戏

移动端微信h5 <template><div class"container" id"container"><div class"regBag"></div><div class"moneyBox"><transitionv-for"(item,index) in showImgList":key"index"…

这个班要不还是别上了吧。

先不提代码写得对不对。咱就是说&#xff0c;打印语句都出不来&#xff0c;搞个chuanchuan哟。 &#xff08;谁能给我解释一下。。&#x1f643;&#xff09;

芯片架构设计及其作用

芯片架构设计是芯片流片前很重要的一个环节&#xff0c;俗称pre-silicon&#xff0c;芯片架构设计的好坏&#xff0c;决定了芯片产品的质量&#xff0c;决定了芯片产品是否易用&#xff0c;决定了芯片产品的性能&#xff0c;决定了芯片产品在市场上是否具有持久性。芯片生产是个…

公众号怎么转移主体

公众号迁移有什么作用&#xff1f;只能变更主体吗&#xff1f;长期以来&#xff0c;由于部分公众号在注册时&#xff0c;主体不准确的历史原因&#xff0c;或者公众号主体发生合并、分立或业务调整等现实状况&#xff0c;在公众号登记主体不能对应实际运营人的情况下&#xff0…