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

leetcode 236. 二叉树的最近公共祖先 在递归函数有返回值的情况下:如果要搜索一条边,递归函数返回值不为空的时候,立刻返回,如果搜索整个树,直接用一个变量left、right接住返回值,这个left、right后序还有逻辑处理的需要,也就是后序遍历中处理中间节点的逻辑(也是回溯)。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。解释:节点 5 和节点 1 的最近公共祖先是节点 3。 阅读详情

描述

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

百度百科中最近公共祖先的定义为:“对于有根树 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时,暂且把它作为公共祖先。

函数需要返回什么呢?本题要找公共祖先,自然就是返回本层的公共祖先是谁。如果left不为空而right为空,说明p、q都在left子树中;如果left为空而right不为空,说明p、q都在right子树中;若left和right都不为空,说明在left和right中p、q各有一个,这样公共祖先就是left和right的父结点root。题目说了p、q一定存在,所以不存在left和right都为空的情况。

本层递归需要做的是找到公共祖先是谁。

解答

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root == NULL || root == p || root == q) return root;//如果找到p、q其中之一,就暂且把它作为公共祖先
        
        root->left = lowestCommonAncestor(root->left,p,q);//使用root->left这样不用开辟新空间,但是改变了树的指向,树不再完整
        root->right = lowestCommonAncestor(root->right,p,q);
        
        if(root->left && root->right) return root;
        return root->left?root->left:root->right;//返回左右子树中是否有p或q结点,有则返回结点,无则返回null
    }
};
LeetCode 236:二叉树的最近公共祖先 特别说明: 输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出:5 解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。 解题思路:   一般二叉树相关的算法题,都可以使用递归这个编程技巧来解题,本题也不例外。 分析:2个节点存在的位置,不外乎以下4种情况: 要么都在左子树上 要么都在右子树上 要么一个在左,一个在右 至少有一个不在这颗二叉树... 阅读详情

相关推荐

LeetCode——236,二叉树的最近公共祖先

/** * \* Created: liuhuichao * \* Date: 2019/8/27 * \* Time: 27:30 PM * \* Description: 二叉树的最近公共祖先 * \ * 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 * <p> * 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为...

我们的征途是星辰大海 585

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

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

Yaoyao2024的博客 5720

2025数学建模国赛A题1-4问详解(论文+完整代码)

本文介绍了数学建模国赛A题的解题思路,重点分析了三维遮蔽模型的建立和运动学代码实现。相比第一题,第二题增加了未知参数求解,需要采用遗传算法等非线性优化方法。文章强调该模型由专业团队原创开发,代码可运行,并提醒参赛者警惕市场上的保奖班现象。整体内容聚焦于竞赛解题技巧和原创性保证。

Eloveeeee的博客 2798

【Leetcode】二叉树的最近公共祖先,二叉搜索树转换成排好序的双向链表,前序遍历与中序遍历构造二叉树

【Leetcode】二叉树的最近公共祖先,二叉搜索树转换成排好序的双向链表,前序遍历与中序遍历构造二叉树

旋律 | 话语 | 色彩 | 情景 2336

ABtest描述统计功效

我们在面试数据分析时,常常会问到如何确定样本量的问题,会有一个指标:统计功效(power),或者是1-β 统计功效会影响实验的可信度,甚至会影响实验所需的样本量,要了解统计功效,首先要理解两类统计错误 假如我们做了一个AB实验,且两组用户的数据均值为μ1和μ2,我们会有两个初始假设: H0:两个实验组的数据没有差别(μ1=μ2),这个假设也叫“零假设”,也叫原假设 H1:两个实验组之间的数据存在差别(μ1≠μ2),这个假设也叫“非零假设”,也叫备择假设 定义两类错误: 实验本身没有效应,但我们觉

qq_38134556的博客 898

电子电器架构刷写方案——General Flash Bootloader

### 文章大体有如下内容: ### 1、简介 ### 2、刷写系统概述 ### 3、Flash Bootloader刷写流程 ### 4、Flash Bootloader架构介绍 ### 5、关于刷写的思考

Soly_kun的博客 2209

二叉树的最近公共祖先

假设我们需要找到结点p,q的最近公共祖先,我们可以发现二叉树的最近公共祖先满足:此结点的左结点和右节点分别存在p,q或者此节点恰好是p,q之一并且他的左右结点之一恰好是另一结点。 我们假设fleft==true表示左节点或左节点的子节点中存在其中一个元素,fleft == false则表示左节点或左节点的子节点中不存在元素,fright同理,则判断一个结点是否最近公共祖先结点的判断条件是: (fleft(fleft(fleft&&fright)∣∣((x=p)∣∣(x=q)frigh..

peko1的博客 2712

QT 实现QStackedWidget切换页面右移动画

首先截取当前界面的图片,渲染到一个QLabel上,然后设置QPropertyAnimation动画,动画的作用对象就是这个QLabel,不断的改变geometry;当动画结束的时候,隐藏并释放这个QLabel。以下是一个QStackedWidget,放了两个QPushButton在上面,点击切换不同的界面。为了方便查看动画特效,设置了每个界面的背景图片。

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 882

编写算法求二叉树中给定结点的所有祖先结点_二叉树:公共祖先问题

给「代码随想录」一个星标吧!❝本来是打算将二叉树和二叉搜索树的公共祖先问题一起讲,后来发现篇幅过长了,只能先说一说二叉树的公共祖先问题。❞236. 二叉树的最近公共祖先链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近...

weixin_32817047的博客 1438

3D深度饼图的QT实现

首先,我们需要创建一个QT项目并创建一个窗口,用于显示我们的饼图。在QT Creator中,选择创建一个新的QT Widgets应用程序项目,并创建一个新的窗口类。在本文中,我将介绍如何使用QT实现一个3D深度饼图(Pie 3D)的可视化效果。在构造函数中,我们将创建一个饼图(QChartView)并设置饼图的数据。这是一个简单的示例,您可以根据需要自定义和扩展代码来创建更复杂的饼图。现在,我们已经完成了3D深度饼图的QT实现。您将看到一个具有相应数据的3D深度饼图显示在窗口中。3D深度饼图的QT实现。

CodeJolt的博客 277

从零开始:C#上位机集成YOLO完成摄像头目标追踪(保姆级教程)

新手入门C#上位机+YOLO做摄像头目标追踪,最忌讳的是“只抄代码,不懂逻辑”。这个教程不仅给了完整代码,还把核心原理和踩坑点都讲清楚了,新手跟着走,不仅能跑通demo,还能理解为什么这么写。如果你们在运行时遇到具体问题,比如模型导出失败、代码报错,都可以在评论区留言,我会一一解答。后续也可以出一期工业相机+YOLO目标追踪的教程,帮助大家把demo落地到实际生产中。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1028

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

Leetcode 236. 二叉树的最近公共祖先1、问题分析2、问题解决3、总结 1、问题分析 题目链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/   本质上就是一个二叉树的遍历问题。代码我已经进行了详细的注释,理解应该没有问题,读者可以作为参考,如果看不懂(可以多看几遍),欢迎留言哦!我看到会解答一下。 2、问题解决   笔者以C++方式解决。 #include "iostream" using n

珍惜 8761

论文必备 - YOLOv8训练前一键扩充数据集,支持9种扩充方法,支持图像和标签同步扩充

在网络模型训练前,大量的数据集是必备的。而对于一些特殊场景中的特殊目标,大量的数据集往往难以获取,无法满足模型训练的基本需求。本文提供了,脚本可一键运行,。

Limiiiing的博客 769

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

5:如果递归到一棵树的左右子树都为空,并且依旧还没找到,就说明这个结点root绝对不是目标结点的公共路径,所以要将这个结点出栈.并返回false.b : 当得到两个结点的祖先路径,我们要将保存两个结点中祖先路径较长的栈出栈,直到和另一个栈的路径长度相等.( 出栈的结点一定没有公共祖先).输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1。输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4。

清欢Allen的技术博客 1311

使用 FastAPI 和 LangGraph 构建生产级智能体 AI 系统

这是一本关于使用 FastAPI 和 LangGraph 构建生产级智能体 AI 系统的详细书籍,全文约 10 万字。《Production-Grade Agentic AI System Design and Implementation: Building Agentic AI Systems Using FastAPI and LangGraph》随着人工智能(AI)技术的迅猛发展,智能体(Agent)作为能够自主感知、推理、决策和行动的实体,正逐渐成为构建复杂智能系统的核心。从个性化推荐、客户服务到

AI天才研究院 346

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

1、求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从低向上的遍历方式。2、在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。3、要理解如果返回值left为空,right不为空为什么要返回right,为什么可以用返回right传给上一层结果。本题没有给出迭代法,因为迭代法不适合模拟回溯的过程。理解递归的解法就够了。

qq_51560134的博客 882

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

普通二叉树 —— 最近公共祖先问题解析(Leetcode 236)

本文解析了如何在普通二叉树中寻找两个节点的最近公共祖先(LCA)。与二叉搜索树不同,普通二叉树没有节点值的有序性,因此需要采用后序遍历加递归回溯的方法。核心思路是:若当前节点是目标节点之一或左右子树均找到目标节点,则当前节点即为LCA。文章通过图示和代码示例(Java实现)详细解释了这一过程,时间复杂度为O(n),空间复杂度为O(h)。该方法是解决树结构问题的常见递归套路,适用于更广泛的二叉树相关问题。

业精于勤,荒于嬉 1305

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

LeetCode236- 二叉树的最近公共祖先

LeetCode236- 二叉树的最近公共祖先 最近全国疫情严重,待在家里没事干,马上又要准备春招了,最近刷刷题,记录一下!再说一句,武汉加油,大家出门记得戴口罩! 1、题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可...

sk18192449347的博客 247

【算法】力扣236. 二叉树的最近公共祖先

给定一个二叉树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。在这个博客中,我们通过递归的方式解决了寻找二叉树中两个节点的最近公共祖先的问题。希望这篇博客对您有帮助。解释:节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。解释:节点 5 和节点 1 的最近公共祖先是节点 3。

未来就在脚下。 994

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

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

Love Peace 900

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

🚅【leetcode】236. 二叉树的最近公共祖先🚀题目💥leetcode代码模板🚀思路💻代码🍪总结 🚀题目 leetcode原题链接 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 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

laplacepoisson的博客 944

leetcode题解236:二叉树的最近公共祖先

本题要求找出二叉树中两个节点的最近公共祖先(LCA)。采用递归解法:若当前节点为空或等于p/q则直接返回;否则递归检查左右子树。当左右子树均返回非空时,当前节点即为LCA;若仅一侧非空,则返回该侧结果。时间复杂度O(n),空间复杂度O(h),其中h为树高。关键点在于通过后序遍历自底向上判断节点关系,利用递归天然的回溯特性定位LCA。

2301_80548884的博客 671

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

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

Musennn的博客 1103

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

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

泛泛之素 435

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

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

peony的博客 253
上一篇: 617. 合并二叉树
下一篇: 动态规划之经典案例《0-1背包问题》详解
MegaBytes
博客等级 码龄8年 45粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值