java数据结构与算法刷题-----LeetCode236. 二叉树的最近公共祖先

【忍者算法】从家族树到二叉树:深入解析最近公共祖先问题|LeetCode 236 二叉树的最近公共祖先 欢迎关注我的公众号【忍者算法】,回复【二叉树】获取精心整理的二叉树专题刷题手册。经典题目、变形题解、大厂真题实战演练,让我们一起在算法的世界里修炼忍者之道!🗡️。 阅读详情
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846

在这里插入图片描述

解题思路:时间复杂度O(n),空间复杂度O(n)
  1. 使用深度优先递归遍历(采用前序遍历),递归返回值为可能得公共祖先
  1. p和q两个结点本身,都可能为公共祖先
  2. 如果当前结点,左子树和右子树分别找到了p和q,那么他就是公共祖先
  1. 出口条件为,如果当前结点为null,那就返回null
  1. 但是如果当前结点正好是p和q的一个,那就返回当前结点
  1. 不是出口时,判断条件:当前结点如果不是p或q,并且不为空
  1. 前序遍历其左子树,保存其返回的可能为公共祖先的结点
  2. 然后使用同样操作来前序遍历其右子树
  1. 当前结点左右子树遍历完成后
  1. 如果左子树返回值为null,那么有可能性存在于右子树,返回右子树
  2. 如果左子树不为null,说明在左子树找到p和q中一个
  3. 则判断右子树是否为null,如果是,那么右子树out,只需要返回左子树
  4. 如果左子树和右子树都不为null,说明左右子树都找到了p和q。那么当前root结点为公共祖先,返回root即可

1. 普通递归

代码:因为官方增加了测试用例,目前相同的算法,以前可以达到5ms,现在只能达到7ms。所以只能击败82%的用户,不是算法比他们的慢

在这里插入图片描述
在这里插入图片描述

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        //如果root为null表示前序遍历到了需要回溯的时候,返回null,表示没找到p和q
        if(root == null || root == p || root == q) return root;//但是如果root就是p和q中的一个,直接开始返回,表示找到了p或q
        //前序遍历,获取返回值,返回值为p或q
        TreeNode left = lowestCommonAncestor(root.left, p, q);//如果没找到p和q,就前序遍历继续找
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        //如果left == null,说明当前结点的左子树没找到p或q
        if(left == null) return right;//返回右子树
        //如果left找到了p或q,但是right == null,说明右子树没找到,返回left
        if(right == null) return left;
        //如果当前left和right都不为null,也就是left和right都找到了p和q,那么当前结点就是最近祖先结点,返回即可。
        return root;
    }
}

2. 优化细节

优化思路
  1. 直接可以找到的公共祖先直接跳过返回
  1. 如果p 和 q是同一个结点,那么这个结点本身就是公共祖先
  2. 如果p是q的直接孩子,或者q是p的直接孩子,那么p或q就是最近公共祖先
  1. 前序遍历完成后,返回前,判断进行优化
  1. 不在进行left == null直接返回right,会多判断一次
  2. 改成如下形式,虽然代码多了,但是进入整体判断流程大大缩短
if (left != null && right != null) return root;//如果左右子树都找到了,那么当前结点root是最近公共祖先
else if (left != null && right == null) return left;//如果右子树是null,但是左子树找到了p或q,返回left
else if (left == null && right != null) return right;//如果左子树是null,但右子树找到p或q,返回right
else return null;//如果啥都没找到,返回null
代码:此时,优化后的代码,就非常接近官方增加测试用例数量前的效率了。

在这里插入图片描述

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (p == q) return q;//如果p和q指向同一个结点,直接返回
        if (p.left == q || p.right == q)return p;//如果p结点的直接孩子是q,返回p
        if (q.left == q || q.right == p) return q;//如果q结点的直接孩子是p,返回q
        return traversal(root, p, q);//如果不是上面的3种情况,则需要递归找
    }

    public TreeNode traversal(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null) return null;//前序遍历,当前结点为null返回null
        if (root == q || root == p) return root;//如果是p和q的一个,直接返回
        //然后继续前序遍历
        TreeNode left = traversal(root.left, p, q);
        TreeNode right = traversal(root.right, p, q);
        if (left != null && right != null) return root;//如果左右子树都找到了,那么当前结点root是最近公共祖先
        else if (left != null && right == null) return left;//如果右子树是null,但是左子树找到了p或q,返回left
        else if (left == null && right != null) return right;//如果左子树是null,但右子树找到p或q,返回right
        else return null;//如果啥都没找到,返回null
    }
}
【数字IC设计】Centos 7桌面版 安装Synopsys EDA Tools 简称DC,是Synopsys公司用于做电路综合的核心工具,可以将HDL描述的电路转换为基于工艺库的门级网表。 阅读详情

相关推荐

别再傻傻分不清!5分钟搞懂倾斜摄影里‘地面分辨率’和‘模型精度’到底啥关系

本文深入解析倾斜摄影中‘地面分辨率’与‘模型精度’的关系,帮助读者快速理解两者的本质区别与内在关联。通过实战案例和公式计算,详细说明如何从航飞设计到精度验证全流程控制,避免常见认知误区,并针对不同应用场景提供精度需求建议。

weixin_33700350的博客 478

二叉树的最近公共祖先【Java实现】

现有一棵n个结点的二叉树(结点编号为从0到n-1,根结点为0号结点),求两个指定编号结点的最近公共祖先。注:二叉树上两个结点A、B的最近公共祖先是指:二叉树上存在的一个结点P,使得P既是A的祖先,又是B的祖先,并且P需要离根结点尽可能远(即层号尽可能大)。

Infinity_and_beyond的博客 1196

ES快速入门,一篇就懂!

Elastic Search 入门前言什么是搜索为什么常用数据库不适合做搜索什么是Lucene什么是Elastic SearchES核心概念ES使用正常启动索引​增删改查ES增加常见问题:ES删除ES查询欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的

qq1592的博客 9311

Leetcode236_二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 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 ...

qq_41864967的博客 360

windchill安装搭建(保姆式)

保姆式搭建windchill 材料准备 Vmware工具,用来创建和打开虚拟机的工具 安装系统的镜像文件 数据库安装文件,这里是Oracle数据库 Windchill的安装包 Vmware工具,用来安装和打开虚拟机的软件 Windowsserver2008的镜像工具,用来安装虚拟机环境的系统,如果你有win2007或win2010的也可以,在做虚拟机时,需要先安装系统。 Oracle数据库安装包 Windchill11M030的安装包 (安装包如有需要可以私信邮箱发送) 虚拟机安装 安装虚拟机VMware

tr1294937662的博客 6218

基于深度学习卷积神经网络的医学图像乳腺癌分类

一、项目背景与意义乳腺癌是女性最常见的恶性肿瘤之一,其早期发现和治疗对于提高患者的生存率和生活质量至关重要。然而,乳腺癌的诊断通常依赖于医生的经验和主观判断,这不仅耗时而且可能存在误差。近年来,深度学习技术特别是卷积神经网络(CNN)在图像处理领域取得了显著进展,为乳腺癌的自动分类提供了新的解决方案。本项目旨在利用深度学习卷积神经网络构建一套高效、准确的医学图像乳腺癌分类系统,辅助医生进行乳腺癌的早期诊断和治疗。二、技术实现。

2301_79810943的博客 976

java 二叉树 最近公共祖先 详解

java 二叉树 最近公共祖先 详解

T_Y_F_的博客 929

2d游戏地图编辑器_[U3D]基于MarchingCubes实现的War3Editor 地表/悬崖编辑器

花了几天时间研究清楚Marching cubes后,发现这个方法是一个非常适用于地图编辑,网格编辑,procedural 生成的工具。最大的优点有着较好的边缘,表面处理。然后我用U3D写了一个悬崖/地表的编辑器。其中使用到了Marching Cubes的2.5D,2D两种降维的方法。talk is cheap,让我看效果!DemoEditor展示https://www.zhihu.com/vide...

weixin_42504649的博客 1178

Java——二叉树的最近公共祖先及二叉搜索树介绍

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”提示:树中节点数目在范围 [2, 105] 内。 -109

申俏雅的博客 1094

使用Python进行核磁数据预处理

随着医学与人工智能技术的快速崛起,伴随算法算力、数据等关键要素的积累和突破,人工智能技术在精准医学领域的科研应用也随之飞快增长,相关科研成果和学术论文数量逐年激增,医学影像人工智能涉及的技术如图像分割、病灶识别、病灶自动勾画、影像组学、深度学习模型构建和临床信息解析越来越趋于分析流程化,模块化,帮助越来越多的医生在临床科研实践中获得突破性的进展。根据具体的应用和数据类型,你可能需要调整或添加额外的步骤。对于更高级的处理,如图像分割或NMR数据的复杂处理,你可能需要查阅更专业的文献或使用更专业的软件工具。

xhlo521的博客 3132

Super4PCS文章阅读笔记

Super4PCS阅读笔记 Super4PCS阅读笔记 前言 前言 今天给大家分享一下点云配准四点法4PCS0的变种——Super4PCS。此算法的原文在:Super4PCS: Fast Global Pointcloud Registration via Smart Indexing。稍微我也会写一篇关于如何使用这篇文章的里所提供的代码进行点云粗配准。关于四点法...

Vodake的博客 4540

Java实现二叉树两个节点最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”来源:力扣(LeetCode)链接:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree。

mcboke的博客 984

innovus中如何设置cts参数

上面是设置cts的一般设置,如果需要对某些skew group或者某些clock tree设置不一样的参数,如需要对clk1这个clock设置不一样的inverter,可以使用。需要查询已经设置过的ccopt参数,可以使用get_ccopt_property去查询,方法和set_ccopt_property一致。言归正传,cts的设置命令是set_ccopt_property,获取命令是get_ccopt_property。另外,set_ccopt_property提供一套命令查询方法。

芯冰乐 545

leetcode 二叉树的最近公共祖先(Java)

Leetcode汇总贴: leetcode经典编程题目(Java实现) leetcode题目 二叉树的最近公共祖先 -- leetcode 236 题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己...

聚沙成塔 7393

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java实现 LeetCode 236 二叉树的最近公共祖先

236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4] 示例 1: 输入:...

南 墙 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【数据结构】二叉树篇|超清晰图解和详解:二叉树的最近公共祖先

首先要明白,当root为p,q的最近祖先节点,只有下面3种情况: 1. p,q在root分别存在于root的左右子树中(异侧)——>root即为最近祖先节点 2. p, q均在root的左侧——>p/q即为最近祖先节点 3. p, q均在root的右侧——>同理

Yaoyao2024的博客 5720

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

236. 二叉树的最近公共祖先

本文介绍了如何在二叉树中寻找两个节点的最近公共祖先(LCA)。采用后序遍历的递归方法,从底向上查找。算法关键点包括:1)当遇到p或q节点时直接返回;2)递归处理左右子树;3)根据左右子树的返回结果判断LCA:若左右子树均找到目标节点,当前根节点即为LCA;若只有一边找到,则返回该边结果。文章通过具体示例和代码实现,详细解释了回溯过程和结果传递机制,强调了遍历整棵树的重要性,即使已找到目标节点仍需完成遍历以确保正确性。

m0_68880377的博客 771

leetcode236.二叉树的最近公共祖先:递归后序遍历的祖先追踪之道

本文详细解析了使用递归法求解二叉树最近公共祖先(LCA)的问题。算法通过后序遍历自底向上查找目标节点,核心在于递归终止条件的设置和后序处理的逻辑判断。当左右子树分别包含目标节点时,当前节点即为LCA。该解法时间复杂度O(n),空间复杂度O(h),简洁高效。文章还分析了常见误区、边界条件处理,并强调了递归法在树结构问题中的优势。理解这一经典方法有助于解决类似的树结构问题。

Musennn的博客 1103

【中等】力扣算法题解析LeetCode236:二叉树的最近公共祖先

本文介绍了如何通过递归深度优先搜索(DFS)在二叉树中查找两个节点的最近公共祖先(LCA)。核心思路是利用后序遍历自底向上搜索,递归终止条件为当前节点为空或找到目标节点。若左右子树均含目标节点,当前节点即为LCA;否则返回非空子树结果。

ylumwd的博客 723

二叉树的最近公共祖先(java)LeetCode第236题

一、题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉树: root =[3,5,1,6,2,0,8,null,null,7,4] 示例 1: 输入...

alan_gaohaodong的博客 844

刷题计划 day20 二叉树(九)【二叉树的最近公共祖先】【二叉搜索树的最近公共祖先】【二叉搜索树中的插入操作】

刷题计划day20二叉树(九)继续,今天主要是二叉树公共祖先相关题目,

weixin_72499901的博客 949

Java LeetCode 236. 二叉树的最近公共祖先(递归)

做一些二叉树的题目,进一步理解递归。

Naion的博客 946

每日一题:Leetcode-236 二叉树的最近公共祖先

力扣题目解题思路java代码。

LIUCHANGSHUO的博客 574

Leetcode 236 题 二叉树的最近公共祖先

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

小猿君的算法笔记 359
上一篇: java数据结构与算法刷题-----LeetCode530. 二叉搜索树的最小绝对差
下一篇: java数据结构与算法刷题-----LeetCode701. 二叉搜索树中的插入操作
ydenergy_殷志鹏
博客等级 码龄7年 5886粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值