力扣:236.二叉树的最近公共祖先(C++)

文章目录

  • 1. 题目描述
  • 2. 题目解析
    • 2.1 思路一
    • 2.1 思路二

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
题目来源: 力扣…二叉树的最近公共祖先

1. 题目描述

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
示例 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 。因为根据定义最近公共祖先节点可以为节点本身。

提示:

树中节点数目在范围 [2, 105] 内。
-10^9 <= Node.val <= 10^9
所有 Node.val 互不相同 。
p != q
p 和 q 均存在于给定的二叉树中。

2. 题目解析

2.1 思路一

判断p q是否分别在当前节点左右子树中或者其中一个就是树的根。
我们可以通过递归来实现这个过程。具体思想是:

  1. 如果当前节点是其中一个目标节点,则直接返回当前节点。
  2. 如果在当前节点的左右子树中分别找到目标节点,说明当前节点就是最近公共祖先。
  3. 否则 p q都在当前节点的左子树或者右子树中,因此在左子树和右子树中继续递归查找。
    在这里插入图片描述

代码如下:

//判断节点x是否在树中
bool InTree(TreeNode* root, TreeNode* x)
{if (root == nullptr) return false;if (root == x) return true;return InTree(root->left, x) || InTree(root->right, x);
}
reeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) 
{//当前节点是其中一个目标节点,则直接返回当前节点if (root == p || root == q) return root;//去当前左子树中查找p节点bool pInLeft = InTree(root->left, p);//在左子树中就不在右子树,因此对pInLeft取反,就是其是否在右子树中的情况bool pInRight = !pInLeft;//对q节点和对p节点一样bool qInLeft = InTree(root->left, q);bool qInRight = !qInLeft;//在当前节点的左右子树中分别找到目标节点,说明当前节点就是最近公共祖先if ((pInLeft && qInRight) || (qInLeft && pInRight)){return root;} else if (pInLeft && qInLeft){//p q都在当前节点的左子树中,因此在左子树中继续递归查找return lowestCommonAncestor(root->left, p, q);} else {//p q都在当前节点的右子树中,因此在右子树中继续递归查找return lowestCommonAncestor(root->right, p, q);}
}

2.1 思路二

通过找到从根节点到目标节点的路径,然后将其转换成链表相交问题。
这种方法的步骤如下:

  1. 找到根节点到p节点的路径。
  2. 找到根节点到q节点的路径。
  3. 找到这两条路径的最后一个公共节点。

画个图理解一下:

在这里插入图片描述
代码如下:

//找根节点到节点x的路径bool GetPath(TreeNode* root, TreeNode* x, stack<TreeNode*>& st){if (root == nullptr) return false;st.push(root);if (root == x) return true;if (GetPath(root->left, x, st)){return true;}if (GetPath(root->right, x, st)){return true;}st.pop();return false;}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {stack<TreeNode*> pPath, qPath;GetPath(root, p, pPath);//找到根节点到p节点的路径。GetPath(root, q, qPath);//找到根节点到q节点的路径。//路径长的先走,直到路径一样长while (pPath.size() != qPath.size()){if (pPath.size() > qPath.size()){pPath.pop();}else{qPath.pop();}}//找这两条路径的最后一个公共节点while (pPath.top() != qPath.top()){pPath.pop();qPath.pop();}return pPath.top();}

至此,本片文章就结束了,若本篇内容对您有所帮助,请三连点赞,关注,收藏支持下。

创作不易,白嫖不好,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!

如果本篇博客有任何错误,请批评指教,不胜感激 !!!
在这里插入图片描述

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

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

相关文章

Execel 数据分析-如何使用筛选-图表-透视图-处理多变量数据集

如果你的数据有很多个变量&#xff0c;比如横轴X有a,b,c,d等几个变量&#xff0c;Y轴也有个变量&#xff0c;那么这时候就用得到。 比如下面的例子&#xff0c;测试GPU的kernel吞吐量&#xff0c;其中stream cnt&#xff0c;grid dim&#xff0c;block dim 产生后面几个变量&am…

Java对象不再使用时,为什么要赋值为 null ?

在Java中&#xff0c;将不再使用的对象赋值为null的目的主要是为了帮助垃圾收集器&#xff08;更快地释放内存。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习编程&#xff0c;不妨点个关注&#xff0c;给个评论222&…

C语言指针详解(3)

前言&#xff1a; 强化数组指针的理解&#xff1a; 在C语言指针详解&#xff08;2&#xff09;-CSDN博客中我们模拟实现了一个二维数组&#xff0c;可能大家对其中的原理还有些模糊&#xff0c;这一章开始之前先梳理一遍。 一维数组的模拟实现&#xff1a; 再剖析二维数组之前…

Java整合EasyExcel实战——2 导出复杂表头

详情代码 实体类 Data public class ComplexHeadData {ExcelProperty({"主标题", "字符串标题"})private String string;ExcelProperty({"主标题", "日期标题"})private Date date;ExcelProperty({"主标题", "数字标…

AI日报|阿里8亿美元购入月之暗面36%股份,Meta首席杨立昆建议不要研究大模型...

文章推荐 阿里通义降价&#xff0c;百度文心免费&#xff0c;一图对比谁是最具性价比大模型&#xff1f; 阿里投资Kimi AI开发商月之暗面&#xff1a;8亿美元购入约36%股权 阿里巴巴在2024财年向AI初创企业月之暗面投资约8亿美元&#xff0c;购入其约36%股权。 月之暗面成立…

这13个前端库,帮我在工作中赢得了不少摸鱼时间

前言 平时开发的过程中&#xff0c;常常会使用到一些第三方库来提高开发效率&#xff0c;我总结了自己工作这么久以来经常用到的 13 个库&#xff0c;希望对大家有帮助&#xff5e; antd 全称应该是Ant Design&#xff0c;这是一个 React 的组件库&#xff0c;旨在提供一套常…

小小“创新券” 有大担当

科技创新券&#xff0c;就是企业在进行项目研发过程中&#xff0c;政府为企业免费发放给企业的一种“权益凭证”&#xff0c;它可以帮助企业向高校、科研院所、科技服务机构等机构购买服务&#xff0c;将大型设备和其他科技创新资源充分利用起来&#xff0c;并通过产研合作等方…

DAOS: A Scale-Out High Performance Storage Stack for Storage Class Memory——论文泛读

Supercomputing Frontiers 2020 Paper 分布式元数据论文阅读笔记整理 问题 企业、政府和学术界出现的数据密集型应用程序将现有的I/O模型扩展到了极限。现代I/O工作负载的特点是元数据与未对齐和碎片化数据的结合比例越来越高。传统的存储堆栈为这些工作负载提供了较差的性能…

✅什么是最左前缀匹配?为什么要遵守?

在 MySQL 中&#xff0c;最左前缀匹配指的是在查询时利用索引的最左边部分进行匹配。当你执行查询时&#xff0c;如果查询条件涉及到组合索引的前几个列&#xff0c;MySQL 就能够利用该复合索引来进行匹配。 组合索引即由多个字段组成的联合索引&#xff0c;比如 idx_col1_col2…

AIGC 003-Controlnet升级你的SD让图像生成更加可控!

AIGC 003-Controlnet升级你的SD让图像生成更加可控&#xff01; 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 ControlNet 论文 (Adding Conditional Control to Text-to-Image Diffusion Models) 提出了一种名为 ControlNet 的神经网络结构&#xff0c;旨在为大型文本到图…

StackExchange.Redis跑起来,为什么这么溜?

StackExchange.Redis 是一个高性能的 Redis 客户端库&#xff0c;主要用于 .NET 环境下与 Redis 服务器进行通信&#xff0c;大名鼎鼎的stackoverflow 网站就使用它。它使用异步编程模型&#xff0c;能够高效处理大量请求。支持 Redis 的绝大部分功能&#xff0c;包括发布/订阅…

创意学习剪辑利器:一键添加动图水印,轻松提升视频专业度与创意新境界!

在数字化时代&#xff0c;视频已成为我们生活中不可或缺的一部分。无论是学习分享、工作展示还是生活记录&#xff0c;视频都以其直观、生动的形式&#xff0c;赢得了广大用户的喜爱。然而&#xff0c;如何在众多的视频中脱颖而出&#xff0c;展现出自己的专业度和创意&#xf…

[AI OpenAI] OpenAI 安全更新

AI 首尔峰会中分享我们的实践 我们自豪地构建并发布了在能力和安全性方面都处于行业领先地位的模型。 超过一亿用户和数百万开发者依赖于我们安全团队的工作。我们将安全视为我们必须在多个时间范围内投资并取得成功的事项&#xff0c;从使今天的模型与我们未来预期的更具能力…

谷歌浏览器使用vue插件查看表单提交的数据

1.查看组件&#xff1a; 对应代码里主页面引用的组件名&#xff1a; 表单名称&#xff0c;对应组件里form表单名&#xff1a; 左边的层次结构&#xff1a; 右边层次结构&#xff1a;

Excel/WPS《超级处理器》同类项处理,合并同类项与拆分同类项目

在工作中处理表格数据&#xff0c;经常会遇到同类项处理的问题&#xff0c;合并同类项或者拆分同类项&#xff0c;接下来介绍使用超级处理器工具如何完成。 合并同类项 将同一列中的相同内容合并为一个单元格。 1&#xff09;用分隔符号隔开 将AB列表格&#xff0c;合并后为…

Spring中@Component注解

Component注解 在Spring框架中&#xff0c;Component是一个通用的注解&#xff0c;用于标识一个类作为Spring容器管理的组件。当Spring扫描到被Component注解的类时&#xff0c;会自动创建一个该类的实例并将其纳入Spring容器中管理。 使用方式 1、基本用法&#xff1a; Co…

企业微信hook接口协议,ipad协议http,已读消息

已读消息 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信send_userid是long要发送的人idisRoom是bool是否是群消息 请求示例 {"uuid":"1753cdff-0501-42fe-bb5a-2a4b9629f7fb","send_userid":788130255…

Unity学习日志

目录 获取相机可视范围的世界坐标(2D) 视口转世界坐标和屏幕转世界坐标的区别: 屏幕转世界坐标 视口转屏幕坐标 视口转屏幕结合3D数学实现可视范围的怪物生成 transform.up游戏对象的方向问题 其实还有一种不用Translate的写法: 修改 transform.up 的行为和影响 C#抽象…

全国各城市间驾车耗时和距离矩阵数据集(更新至2022年)

数据简介&#xff1a;城市之间距离越远&#xff0c;耗时越长。经济发达地区的交通状况较好。各城市之间的驾车耗时和距离存在差异。有些城市之间的交通非常便捷&#xff0c;而有些城市之间的交通则较为不便。这表明中国的交通网络发展尚不平衡&#xff0c;需进一步优化。特别是…

Excel如何统计非数值内容行数

需要用到sum函数&#xff0c;具体公式如下&#xff1a; SUM(IF(ISNONTEXT(G4:G199),0,1))