剑指 Offer 68 - II. (二叉树)二叉树的最近公共祖先

题目描述

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

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉树: 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 为不同节点且均存在于给定的二叉树中。

题目分析

做了一些二叉树的题,发现二叉树的查找问题一般都是从左右子树递归去解决,也往往都能得到答案,因此,这道题可以考虑是否能从左右子树进行递归去解决呢?
首先,要想通过递归来实现,就需要先确定临界条件,那么临界条件是什么呢?换句话说,临界条件就是递归中能够直接返回的特殊情况,第一点则是最常见的“判空”,判断根结点是否是空节点,如果是,那么肯定就可以马上返回了,这是一个临界条件;再来考虑题意,在以root为根结点的树中找到p结点和q结点的最近公共祖先,那么特殊情况是什么呢?很显然,特殊情况就是根结点就等于q结点或p结点的情况,想一下,如果根结点为二者之一,那么根结点就必定是最近公共祖先了,这时直接返回root即可。由此看来,这道题就一共有三种特殊情况,root == q 、root == p和root==null,这三种情况均直接返回root即可。
根据临界条件,实际上可以发现这道题已经被简化为查找以root为根结点的树上是否有p结点或者q结点,如果有就返回p结点或q结点,否则返回null。
这样一来其实就很简单了,从左右子树分别进行递归,即查找左右子树上是否有p结点或者q结点,就一共有4种情况:
第一种情况:左子树和右子树均找没有p结点或者q结点;(这里特别需要注意,虽然题目上说了p结点和q结点必定都存在,但是递归的时候必须把所有情况都考虑进去,因为题目给的条件是针对于整棵树,而递归会到局部,不一定都满足整体条件)
第二种情况:左子树上能找到,但是右子树上找不到,此时就应当直接返回左子树的查找结果;
第三种情况:右子树上能找到,但是左子树上找不到,此时就应当直接返回右子树的查找结果;
第四种情况:左右子树上均能找到,说明此时的p结点和q结点分居root结点两侧,此时就应当直接返回root结点了。
综上也不难写出结果了:

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

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

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

相关文章

从狼群智能到无人机群协同决策

来源:飞思实验室文:小翼生物群集行为是自然界存在的一种普遍现象 ,先前的研究已表明人们可以通过模仿鸟群、鱼群、蜂群等行为, 研究其群体性决策机制, 进而用于构建集群系统的决策系统框架. 狼群在认知、分工, 以及复杂环境适应性等方面具有突出的优势, …

华为自动驾驶实车实路测试视频曝光!

来源:量子位、物联网智库等自动驾驶的风又刮起来了,这次处在风暴中心的是华为。4月15日,消息称配备华为自动驾驶技术的北汽新能源极狐阿尔法S的HI版车型在上海进行了公开试乘,这也是华为自动驾驶技术公开试乘的全球首秀。就试乘效…

未来智能:人有人用,机有机用

来源: 苇草智酷作者:王飞跃当今最好的人工智能程序到底有多智能?它们是如何工作的?能做些什么?我们有必要担心机器比人类聪明且将很快夺取我们的工作吗?以上这些问题都颇受人们的关注,梅拉妮米歇…

因果作用推断、因果网络学习及其他

来源:久章智能 未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联网(城市)云脑研究计划,构建互联网(城市)云脑技术和企业图谱…

通信人工智能的下一个十年(上)

来源:电信科学欧阳晔1, 王立磊1, 杨爱东1, 马利克萨哈2, 大卫贝兰格3,4, 高同庆5, 韦乐平6, 张亚勤71 亚信科技(中国)有限公司,北京 1001932 美国威瑞森电信公司,美国 纽约 100363 美国电话电报公司,美国 得…

大脑使用交叉存储,来区分现在和过去

来源:混沌巡洋舰在每一个清醒的时刻,人类和其他动物必须在我们对过去的记忆和对现在的意识两者中保持平衡。我们必须吸收关于周围世界的新的感官信息,同时保持对早期观察或事件的短期记忆。我们理解周围环境、学习、行动和思考的能力都依赖于…

对象在内存中的存储布局

对象头包含: markword(和锁相关的信息) 8字节 class pointer(说明对象属于哪个类),jvm指针八字节,但是默认压缩,所有4个字节 对象体包含: instance word实例数据(例如int,这就占四个字节,l…

用研究新范式破解生命科学难题

来源:中国科学报 作者:丛斌(中国工程院士)采访整理:张思玮(本报记者)当今,世界科技正处于重大变革前夕。各领域科学家们一直积极地探索物质本质、宇宙本源、生命本质,并迫…

synchronized与volatile

synchronized实现过程: 1.Java代码:synchronized 2.字节码层级:monitorenter,monitorexit 3.执行过程中自动升级(偏向->自旋->重量级锁) 4.cpu汇编层级:lock comxchg 上图为双核cpu的内部构造&am…

AI 技术与人类主体想象 ——基于人工直觉在线讨论的研究

来源: 人工智能哲学探索作者:雅克布约翰森(英国圣玛丽大学) 王鑫(辽宁大学)一、引言:AI、神经形态硬件、人工直觉AI 在媒体上的讨论越来越多,很多广为流行的专业网站上的相关探讨涵盖了 AI 发展的最新趋势和…

Java四种引用

强引用:没有使用时调用System.gc()会回收 eg:M m new M(); mnull;System.gc(); 软引用:内存不够时就回收 作用:一般使用在缓存时,比如把一些图片存储,内存不够时就自动回收 弱引用: 垃圾回…

永动机与热力学定律

来源:力学酒吧 撰文:张伟伟热力学三大定律分别为能量守恒、熵增定律和绝对零度无法到达,人们对热力学定律的认识也是纠正永动机思想的过程,是人类“美好思想”不断“碰壁”的过程,这些“碰壁”对于个人成长有着深刻的启…

浅析ThreadLocal

线程本地变量 每个线程独立拥有,线程存在,ThreadLocal就一直存在。 使用场景:spring 事务 里面有m方法,m调用了m1,m2,比如m1,m2都去访问数据库 如果分别建立两个数据库连接,事务…

工业机器人技术全解析,值得收藏!

来源:先进制造业一、工业机器人的发展背景1920年,捷克剧作家卡里洛奇别克在其科幻剧本《罗萨姆万能机器人制造公司》(Rossums Universal Robots)首次使用了ROBOT这个名词,之后便成为机器人的代名词。1938年3月&#xf…

JQuery 数组按指定长度分组

JQuery方法// 将data每3个一组进行分组var data [法国,澳大利亚,智利,新西兰,西班牙,加拿大,阿根廷,美国,0,国产,波多黎各,英国,比利时,德国,意大利,意大利,]; var result []; for(var i0,lendata.length;i<len;i3){result.push(data.slice(i,i3)); }lodash方法var data …

中科创星米磊:从五个方向筛选“硬科技”企业

来源&#xff1a;经济日报-中国经济网记者/梁 睿米磊建议创投和保荐机构从五个方面入手筛选“硬科技”企业&#xff1a;“围绕落实国家战略规划确定的科技发展方向或承担具体攻关任务的企业&#xff1b;拥有关键核心技术和先进技术的企业&#xff1b;科技创新和转化应用能力突出…

多线程下实现自增的几种方式

前情回顾&#xff1a;i操作并不是原子操作&#xff0c;因此多线程下会达不到预期的效果&#xff0c;需要通过加锁或AtomicInteger或LongAdder等方法来实现。 i可以分为三步 我们通过实验来观察实现i操作的方式。 下面实验中通过继承Thread实现了多线程 错误方法&#xff1a;…

Fast R-CNN(理解)

0 - 背景 经典的R-CNN存在以下几个问题&#xff1a; 训练分多步骤&#xff08;先在分类数据集上预训练&#xff0c;再进行fine-tune训练&#xff0c;然后再针对每个类别都训练一个线性SVM分类器&#xff0c;最后再用regressors对bounding box进行回归&#xff0c;并且bounding …

全球最顶级的十大创新公司

来源&#xff1a;中企思智库2021年2月英国著名的全球信息服务提供商科睿唯安发布了“2021年度全球百强创新机构”榜单&#xff0c;榜单通过衡量全球各大企业机构专利实力以及创新文化进行综合评选&#xff0c;具体排名如下&#xff1a;3M——是世界第一大创新企业&#xff0c;A…

读《redis设计与实现》笔记--redis数据结构

redis五大数据结构&#xff1a;string&#xff0c;hash&#xff0c;list&#xff0c;set&#xff0c;zset(有序集合) redis底层数据结构&#xff1a;简单动态字符串(SDS)&#xff0c;链表&#xff0c;字典&#xff0c;跳表&#xff0c;整数集合&#xff0c;压缩列表 底层数据…