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

C++ 倍增算法求解最近公共祖先(LCA)

LCA(最近公共祖先) 什么是最近公共祖先问题? 字面而言,指在树上查询两个(也可以是两个以上)节点的祖先,且是离两个节点最近祖先。如下图所示: 节点 12和节点11的公共祖先有节点4和节点8。...节点8是离12和11最近祖先。即12和11的最近公共祖先是8。也可描述为LCA(12,11)=8。 Tips: LCA是(Lowest Common Ancestor 最近公共祖先)的简称。...两点的最近公共祖先必定处在树上两点间的最短路上。如下图,节点9和7之间的最短路径一定经过其最近公共祖先。这个很好理解,自行参悟。 d(u,v)=h(u)+h(v)-2h(LCA(u,v))。...LCA 朴素算法 向上标记法 向上标记法的思想很简单,如求节点9和7的最近公共祖先。 先以节点 9(也可以选择节点7)为起点,向上沿着根节点方向查询,并一路标记访问过的节点,如下图红色节点。...本文主要讲解使用培增法求解最近公共祖先。 3. LCA 倍增算法 倍增算法的本质还是补素算法,在其基础上改变了向上跳跃的节奏。不采用一步一步向上跳,而是以2的幂次方向上跳。

25610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Python算法——最近公共祖先

    Python中的最近公共祖先(Lowest Common Ancestor,LCA)算法详解 最近公共祖先(Lowest Common Ancestor,LCA)是二叉树中两个节点的最低共同祖先节点。...在本文中,我们将深入讨论最近公共祖先问题以及如何通过递归算法来解决。我们将提供Python代码实现,并详细说明算法的原理和步骤。...最近公共祖先问题 给定一个二叉树和两个节点p、q,找到这两个节点的最近公共祖先。 递归算法求解最近公共祖先 递归算法是求解最近公共祖先问题的一种常见方法。...{}".format(p.val, q.val, lca.val)) 输出结果: 节点 5 和节点 1 的最近公共祖先是节点 3 这表示在给定的二叉树中,节点5和节点1的最近公共祖先是节点3。...递归算法在解决最近公共祖先问题时具有简洁而高效的特性。通过理解算法的原理和实现,您将能够更好地处理树结构问题。

    27210

    深度剖析倍增算法求解最近公共祖先(LCA)的细枝末节

    LCA(最近公共祖先倍增算法的基本思想在前面的博文中有较详细的介绍,本文不再复述。此文仅讲解如何使用倍增算法求解多叉树中节点之间的最近公共祖先问题。 什么是最近公共祖先问题?...两点集并的最近公共祖先为两点集分别的最近公共祖先最近公共祖先,即LCA(A U B )=LCA( LCA(A),LCA(B) )。如下图,点集A={6,7},则LCA(A)=3。...利用这个性质,可以求解任意多节点之间的最近公共祖先。 两点的最近公共祖先必定处在树上两点间的最短路上。如下图,节点9和7之间的最短路径一定经过其最近公共祖先。这个很好理解,自行参悟。...LCA 朴素算法 知道了什么是LCA后,再来了解怎么得到给定的任意 2 点的最近公共祖先。 向上标记法 向上标记法的思想很简单,如求节点9和7的最近公共祖先。...本文主要讲解使用培增法求解最近公共祖先。 3. LCA 倍增算法 倍增算法的本质还是补素算法,在其基础上改变了向上跳跃的节奏。不采用一步一步向上跳,而是以2的幂次方向上跳。

    34110

    LCA 最近公共祖先

    LCA 最近公共祖先 Tarjan(离线)算法的基本思路及其算法实现     首先是最近公共祖先的概念(什么是最近公共祖先?)...:     在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上深度最大的公共祖先节点。     ...换句话说,就是两个点在这棵树上距离最近公共祖先节点。     所以LCA主要是用来处理当两个点仅有唯一一条确定的最短路径时的路径。     ...举个例子吧,如下图所示4和5的最近公共祖先是2,5和3的最近公共祖先是1,2和1的最近公共祖先是1。  ?     这就是最近公共祖先的基本概念了,那么我们该如何去求这个最近公共祖先呢?     ...常用的求LCA的算法有:Tarjan/DFS+ST/倍增     后两个算法都是在线算法,也很相似,时间复杂度在O(logn)~O(nlogn)之间,我个人认为较难理解。

    1.5K80

    离线Tarjan算法-最近公共祖先问题

    转载自Tarjan算法 LCA问题(Least Common Ancestors,最近公共祖先问题),是指给定一棵有根树T,给出若干个查询LCA(u, v)(通常查询数量较大),每次求树T中两个顶点u和...v的最近公共祖先,即找一个节点,同时是u和v的祖先,并且深度尽可能大(尽可能远离树根)。...一 LCA问题 LCA问题的一般形式:给定一棵有根树,给出若干个查询,每个查询要求指定节点u和v的最近公共祖先。 LCA问题有两类解决思路: 在线算法,每次读入一个查询,处理这个查询,给出答案。...< query[x].size(); i++) //与根节点x有关的查询 if (vs[query[x][i]]) //如果查询的另一个节点已访问,则输出结果 printf("%d和%d的最近公共祖先为...:1 5和4的最近公共祖先为:1 5和7的最近公共祖先为:5 1和4的最近公共祖先为:1 6和1的最近公共祖先为:0 3和4的最近公共祖先为:0 0和5的最近公共祖先为:0 */ }

    1.8K51

    最近公共祖先LCA

    最近公共祖先(Lowest Common Ancestors,LCA)指有根树中距离两个节点最近公共祖先祖先指从当前节点到树根路径上的所有节点。...u和v的公共祖先指一个节点既是u的祖先,又是v的祖先。u和v的最近公共祖先指距离u和v最近公共祖先。若v是u的祖先,则u和v的最近公共祖先是v。 可以使用LCA求解树上任意两点之间的距离。...求解LCA的方法有很多,包括暴力搜索法、树上倍增法、在线RMQ算法、离线Tarjan算法和树链剖分。...3.算法分析 以暴力搜索法求解LCA,两种方法的时间复杂度在最坏情况下均为O(n)。 & 原理2 树上倍增法 树上倍增法不仅可以解决LCA问题,还可以解决很多其他问题,掌握树上倍增法是很有必要的。...此时x、y的父节点为最近公共祖先节点,即LCA(x, y)=F[x][0]。 完整的求解过程如下图所示。

    86410

    最近公共祖先详解_共同祖先

    最近公共祖先 带查询的节点为x和y节点,书的深度为d 暴力求解:设置访问数组vis[N],以此遍历x的父节点并做标记,然后再遍历y的父节点,第一个被做标记的就是公共祖先,时间复杂度为O(d)...倍增法:f[i][j]代表当前节点向上走 2 j 2^j 2j所能走到的节点,其中 0 ≤ j ≤ ⌈ l o g ( d ) ⌉ 0\leq j \leq \lceil log(d) \rceil 0...时间复杂度为O(logn),另外还需要设置dist[N]代表节点i到根的距离+1,哨兵:如果从i开始跳 2 j 2^j 2j步会跳过根节点,那么f[i][j] = 0,dist[root]=0 Tarjan离线算法...:将每一个搜索过的点归类到他的代表节点中去,代表节点就是搜索过的节点与当前节点的公共祖先。...时间复杂度O(n) 倍增法 先将两个点跳到同一层 再让两个点往上跳,一直跳到他们的公共祖先的下一个几点。我们跳的时候是基于二进制拼凑的思想,从最高位到最低位判断。

    46130

    P3379 【模板】最近公共祖先(LCA)

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近公共祖先。 输入输出格式 输入格式: 第一行包含三个正整数N、M、S,分别表示树的结点个数、询问的个数和树根结点的序号。...接下来M行每行包含两个正整数a、b,表示询问a结点和b结点的最近公共祖先。 输出格式: 输出包含M行,每行包含一个正整数,依次为每一个询问的结果。...第一次询问:2、4的最近公共祖先,故为4。 第二次询问:3、2的最近公共祖先,故为4。 第三次询问:3、5的最近公共祖先,故为1。 第四次询问:1、2的最近公共祖先,故为4。...第五次询问:4、5的最近公共祖先,故为4。 故输出依次为4、4、1、4、4。...=f[y][i]) 58 x=f[x][i],y=f[y][i];// 如果他们跳完之后的祖先不相等的话,就继续跳 59 return f[x][0];//按这样跳下去,一定会跳到只要再跳一步就能找到最近公共祖先的位置

    95260

    二叉树的最近公共祖先

    二叉树的最近公共祖先 力扣链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先...百度百科中最近公共祖先的定义为:“对于有根树 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 的最近公共祖先是节点...直观上来看,找到最近公共祖先,直接一路返回就可以了。 如图: 236.二叉树的最近公共祖先 就像图中一样直接返回7,多美滋滋。...如图: 236.二叉树的最近公共祖先1 图中节点10的左子树返回null,右子树返回目标值7,那么此时节点10的处理逻辑就是把右子树的返回值(最近公共祖先7)返回上去!

    2.5K20

    二叉搜索树的最近公共祖先

    JavaScript实现LeetCode第235题:二叉搜索树的最近公共祖先 题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。...百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”...3 5 示例 1: 输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8 输出: 6 解释: 节点 2 和节点 8 的最近公共祖先是...示例 2: 输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4 输出: 2 解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身...q) } else if(pVal < parentVal && qVal < parentVal) { // 如果p、q均小于root,则应该由root的左子树返回p、q的最近公共祖先

    43130

    How to find the lowest common ancestor in a tree 最近公共祖先

    [题目] 求二叉树的任意两个节点的最近公共祖先。 此题有多个扩展问题: 如果只查询一次,二叉树给出向上(parent)链接和不给向上链接时分别有什么解法,最佳空间时间复杂度是多少?...2 3 / \ \ 4 5 6 对于左侧二叉树, 节点 4 , 5的最近公共祖先是...2,节点5,6的最近公共祖先是1 [澄清] 在面试中,面试者一般不直接告诉你树是否有向上链接,能否自定义树的node,而这类信息对此题的解法复杂度又有相当重要的影响,面试时应该主动向面试者提出。...显然,此次相遇是他们第一次相遇,而相遇时所在的节点也就是最近公共祖先节点。 如果没有向上链接,我们只能通过遍历树的方法来的到最近公共祖先。...可以证明,在一棵树中,最近公共祖先必然是1)p1,p2节点中的一个,或者2)p1,p2分别在其左右子树中。通过后序遍历整棵树,分别判断如上的条件即可得到结果。

    62740
    领券