首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

二叉树的最低公共祖先--递归解

二叉树的最低公共祖先是指在给定的二叉树中,找到两个指定节点的最低公共祖先节点。递归解是一种常用的解决方法,可以通过递归地遍历二叉树来找到最低公共祖先。

递归解的思路如下:

  1. 如果当前节点为null或者等于其中一个目标节点,则返回当前节点。
  2. 在左子树中递归查找两个目标节点,返回值分别记为left。
  3. 在右子树中递归查找两个目标节点,返回值分别记为right。
  4. 如果left为null,则说明两个目标节点都不在左子树中,最低公共祖先节点在右子树中,返回right。
  5. 如果right为null,则说明两个目标节点都不在右子树中,最低公共祖先节点在左子树中,返回left。
  6. 如果left和right都不为null,则说明两个目标节点分别位于左右子树中,最低公共祖先节点为当前节点,返回当前节点。

递归解的时间复杂度是O(n),其中n是二叉树中节点的个数。这是因为每个节点最多遍历一次。

在腾讯云中,推荐使用COS(腾讯云对象存储)来存储和管理二叉树相关的数据。COS是一种安全、低成本、高可靠的云存储服务,适用于各种场景,包括数据备份、图片视频分享、企业网站数据存储等。

更多关于腾讯云COS的信息和产品介绍,您可以访问以下链接: https://cloud.tencent.com/product/cos

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

算法:二叉树中两个节点最低公共祖先(LCA)

思路要找到一个二叉树中两个节点最低公共祖先(Lowest Common Ancestor, LCA),需要考虑以下几点:定义LCA:对于节点 A 和 B,它们LCA是指在二叉树中同时作为 A 和 B...祖先最低节点。...Go实现示例下面是用 Go 实现二叉树中两个节点最低公共祖先(LCA)可以采用递归方法,这里假设已经定义了二叉树节点结构体:package mainimport "fmt"type TreeNode...在 main 函数中,构造了一个二叉树,并找到了节点 5 和节点 1 最低公共祖先。...在最坏情况下,递归调用空间复杂度为 O(n)。因此,整体来说,通过递归遍历二叉树来寻找两个节点最低公共祖先时间复杂度是 O(n),这保证了算法在合理时间范围内解决问题,适用于一般大小二叉树

15110
  • 二叉树最近公共祖先

    二叉树最近公共祖先 力扣链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree 给定一个二叉树, 找到该树中两个指定节点最近公共祖先...思路 遇到这个题目首先想是要是能自底向上查找就好了,这样就可以找到公共祖先了。 那么二叉树如何可以自底向上查找呢? 回溯啊,二叉树回溯过程就是从低到上。...直观上来看,找到最近公共祖先,直接一路返回就可以了。 如图: 236.二叉树最近公共祖先 就像图中一样直接返回7,多美滋滋。...如图: 236.二叉树最近公共祖先1 图中节点10左子树返回null,右子树返回目标值7,那么此时节点10处理逻辑就是把右子树返回值(最近公共祖先7)返回上去!...,完整流程图如下: 236.二叉树最近公共祖先2 从图中,大家可以看到,我们是如何回溯遍历整颗二叉树,将结果返回给头结点

    2.5K20

    二叉树最近公共祖先

    个人主页: :✨✨✨初阶牛✨✨✨ 强烈推荐优质专栏: C++世界(持续更新中) 推荐专栏1: C语言初阶 推荐专栏2: C语言进阶 个人信条: 知行合一 本篇简介:>:记录力扣题 二叉树最近公共祖先...✨ 题目介绍: 给定一个二叉树, 找到该树中两个指定节点最近公共祖先。...百度百科中最近公共祖先定义为:“对于有根树 T 两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 祖先且 x 深度尽可能大(一个节点也可以是它自己祖先)。”...正经解题: 试着观察最近公共祖先,如果只是普通祖先,则这两个结点都在其中一个子树中....(1)全在该结点左子树 (2)全在该结点右子树 如果是最近公共祖先,则一个结点在左子树,一个在右子树. (1) 如果全在左子树,则往左子树方向继续找.

    21710

    二叉树-最近公共祖先

    已知二叉树,求二叉树中给定两个节点最近公共祖先。 最近公共祖先: 两节点v与w最近公共祖先u,满足在树上最低(离根最 远),且v,w两个节点都是u子孙。 LeetCode 236....Lowest Common Ancestor of a Binary Tree 思考与分析 1.两个节点公共祖先一定在从根节点,至这两个节点路径上。...2.由于求公共祖先最近公共祖先,那么即同时出现在这两条路 径上离根节点最远节点(或离两个最近)。 3.最终算法即:求p节点路径,q节点路径,两路径上最后一个相同 节点。 ?...2.同时遍历p节点路径与q节点路径,遍历n个节点,最后一个相同节点,即最近 公共祖先。...if(node_p_path[i] = node_q_path[i]){ result = node_p_path[i]; }//最后相同节点为最近公共节点

    73120

    LeetCode 236:二叉树最近公共祖先

    这是无量测试之道第216篇原创 特别说明: 输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出:5 解释:节点 5 和节点 4 最近公共祖先是节点...因为根据定义最近公共祖先节点可以为节点本身。 ---- 解题思路:   一般二叉树相关算法题,都可以使用递归这个编程技巧来解题,本题也不例外。...先从左子树上找共同祖先,记为left    2....如果left为nil,则说明要么2个节点都在右子树上,或者至少有一个不在这个二叉树上。 关于递归:    递归这种编程技巧是非常有用,掌握它,可以为我们解决很多思考起来很麻烦题目。...后续为了让大家体会到递归编程技巧强大,我又借二叉树遍历例子用递归来实现为大家展示递归强大。大家如果想更好理解递归调用栈的话,可以看我自己写文章:leetcode 递归编程技巧-链表算法题。

    28610

    LeetCode 二叉树最近公共祖先(二叉树)

    题目 给定一个二叉树, 找到该树中两个指定节点最近公共祖先。...百度百科中最近公共祖先定义为:“对于有根树 T 两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 祖先且 x 深度尽可能大(一个节点也可以是它自己祖先)。”...= 5, q = 1 输出: 3 解释: 节点 5 和节点 1 最近公共祖先是节点 3。...因为根据定义最近公共祖先节点可以为节点本身。 说明: 所有节点值都是唯一。 p、q 为不同节点且均存在于给定二叉树中。...思路 递归自底向上遍历每个节点: 如果此节点为空返回空; 如果此节点为p或q返回该节点; 如果该节点左孩子或右孩子为p或q,返回该节点左子树或右子树; 如果该节点左子树为p右子树为q则该节点为最近公共祖先

    19710

    【LeetCode 236.二叉树最近公共祖先】双解法:递归实现 + 利用父指针

    题目描述:给定一个二叉树, 找到该树中两个指定节点最近公共祖先。 解法 1: 递归实现(推荐) 这题相较于 LeetCode 235.二叉搜索树最近公共祖先 递归思考起来比较有难度。...封装一个 recurseTree 递归函数,它返回 true/false,代表当前二叉树中是否存在 p、或者存在 q、或者两个节点都存在。...在 recurseTree 递归过程中,如果发现当前二叉树同时存在 p 和 q,那么就更新最近公共祖先。...那么对 node 来说,它所有祖先节点就是从 node 开始,一直向上遍历父亲节点,统计过程中所有经历节点,这些节点组成集合就是所有祖先节点。...整体思路如下: 遍历二叉树,直到 p 和 q 都被遍历完 统计 p 所有祖先节点,放入集合 set 中 从 q 开始,不断向上访问祖先节点,每次都检查节点是否在集合 set 中 代码实现如下: //

    29340

    Day19-二叉树-最近公共祖先

    Q:已知一个二叉树,给定两个节点,求这两个节点最近公共祖先 举例:网上找一张图 ?...5,0最近公共祖先,就是3,根节点 5,4最近公共祖先,就是5 7,4最近公共祖先,就是2 三 冷静分析 其实有了昨天题,是做了很好铺垫。...逻辑比较简单,我直接说了啊 1.首先我们需要知道,两个节点公共祖先,一定在,从根节点到这两个节点路径上。...举例: 节点7路径:3 -> 5 -> 2 -> 7 节点4路径:3 -> 5 -> 2 -> 4 长度一样,同时遍历两个路径,当发现最后相同节点,即2,就是最近公共祖先了 四 完整代码及注释...root || finish){//用finish来标识是否找到了待搜索节点,以免不必要递归 return; } path.push_back(root);

    88910

    二叉树最近公共祖先

    题目 给定一个二叉树, 找到该树中两个指定节点最近公共祖先。...百度百科中最近公共祖先定义为:“对于有根树 T 两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 祖先且 x 深度尽可能大(一个节点也可以是它自己祖先)。”...二叉搜索树最近公共祖先 《剑指Offer》同题:面试题68 - II. 二叉树最近公共祖先 《程序员面试金典》同题:面试题 04.08. 首个共同祖先 2....解题 如果左右子树都找到了,就返回root 如果只有一边找到就返回非空那边 如果都没有找到就返回NULL 递归查找 ?...NULL;//返回NULL if(left && right)//左右都找到了p,q,root就是答案 return root; else//一遍找到了p,q,返回找到那边

    43930

    LeetCode-236-二叉树最近公共祖先

    # LeetCode-236-二叉树最近公共祖先 给定一个二叉树, 找到该树中两个指定节点最近公共祖先。...百度百科中最近公共祖先定义为:“对于有根树 T 两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 祖先且 x 深度尽可能大(一个节点也可以是它自己祖先)。”...5, q = 1 输出: 3 解释: 节点 5 和节点 1 最近公共祖先是节点 3。...因为根据定义最近公共祖先节点可以为节点本身。 说明: 所有节点值都是唯一。 p、q 为不同节点且均存在于给定二叉树中。...= null) { return root;//如果左右都存在,就说明pq都出现了,这就是,公共祖先,此时不用考虑公共祖先是自己情况,因为上面已经做过判断了。

    24320

    二叉树最近公共祖先

    二叉树最近公共祖先题解集合 DFS BFS 总结 ---- DFS 对于二叉树中某两个节点最近公共祖先,存在两种情况: 1.分别位于两个不同子树中 首先,我们知道递归处理是规模不同...,问题相同事情,这里情况1中 规模不同是处理每颗二叉树大小不同, 问题相同指的是都是找当前二叉树左右子树根节点为最近公共祖先 2.位于同一颗子树中 同上可知,这里处理也是规模不同,...问题相同事情 既然都是规模不同,问题相同,那就可以用递归解决 那么用递归解决思路是什么呢?...当前节点即为最近公共祖先; 如果左右子树其中一个不为空,则返回非空节点,此时返回非空节点就是最近工作祖先,如果左右子树其中一个为空,则表示当前子树中不存在p和q节点 这里对上面的思路进行画图解释一波:...二叉树最近公共祖先一模一样原题

    23510

    二叉树最近公共祖先 II

    题目 给定一棵二叉树根节点 root,返回给定节点 p 和 q 最近公共祖先(LCA)节点。 如果 p 或 q 之一不存在于该二叉树中,返回 null。 树中每个节点值都是互不相同。...根据维基百科中对最近公共祖先节点定义:“两个节点 p 和 q 在二叉树 T 中最近公共祖先节点是后代节点中既包括 p 又包括 q 最深节点(我们允许一个节点为自身一个后代节点)”。...示例 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。...根据共同祖先节点定义,一个节点可以是自身后代节点。

    37250

    二叉树简单实战 → 一起温故下二叉树遍历

    前情回顾   对二叉树遍历还不了解,先去看看:二叉树遍历 → 不用递归,还能遍历吗   简单来说,深度遍历用 栈 辅助实现,广度遍历用 队列 辅助实现   不管是递归(系统栈)实现,还是 栈...严格来时,是满二叉树中序遍历)   很简单,直接看代码   这题很容易,只要你去实操折纸,找到了规律,代码实现就是手到擒来   最低公共祖先   求同一棵二叉树中两个节点最低公共祖先节点   什么是最低公共祖先...,节点往上向根节点移动,两个节点最先汇聚节点则是这两个节点最低公共祖先,例如   10 和 4 最低公共祖先就是 3   简单做法是借助哈希表   先遍历一次二叉树,记录所有节点父节点(HashMap...中   一旦找到,这直接返回该节点,就是 n1 与 n2 最低公共祖先   我们来看代码   很好理解,也很好实现,就是有点费空间   还有一种方式,实现非常简单,但却不好理解,是前辈们反复提炼之后得到一种解法...总结   1、二叉树遍历是二叉树基础,基础一定要打牢     相信大家已从上述几个案例中感觉到了     基础不牢,地动山摇,你们懂   2、举案例有限,目的也仅仅只是给大家找找感觉

    27820

    用 Git 来讲讲二叉树最近公共祖先

    二叉树最近公共祖先 这个问题可以在 LeetCode 上找到,第 236 题,看下题目: 函数签名如下: TreeNode lowestCommonAncestor(TreeNode root,...TreeNode p, TreeNode q); root节点确定了一棵二叉树,p和q是这这棵二叉树两个节点,让你返回p节点和q节点最近公共祖先节点。...描述:函数参数中变量是root,因为根据框架,lowestCommonAncestor(root)会递归调用root.left和root.right;至于p和q,我们要求它俩公共祖先,它俩肯定不会变化...这就是一个巧妙地方了,因为这里是二叉树后序遍历啊!前序遍历可以理解为是从上往下,而后序遍历是从下往上,就好比从p和q出发往上走,第一次相交节点就是这个root,你说这是不是最近公共祖先呢?...综上,二叉树最近公共祖先就计算出来了。

    60410
    领券