向下减小指数j的值为1,重新向上跳 21=2 步。 直观来讲,节点3是LCA,但是程序不能就此做出判断,只能说明找到了公共祖先,但是不能说明是LCA。所以还得修正成向上跳 20=1步。得到2个节点的祖先是不相同,此时,可得到结论,节点3是LCA。 总结如下: 当跳到的节点是2个节点的共同祖先时,则需要再减少指数,重新跳。
如果u和v的最近公共祖先为 lca,则 u 和 v之间的距离为 u 到树根的距离加上 v到到树根的距离,减去 2倍的 lca到树根的距离: dist[u] + dist[v] -2*dist[lca] 求解LCA的方法有很多,包括 1. 暴力搜索法, 2. 树上倍增法, 3. 在线 RMQ算法,4. 离线 Tarjan算法,5. 树链剖分法。本节只讲前 4种...
将u、v中较深的节点向上走到和深度较浅的节点同一深度,然后两个点一起向上走,直到走到同一个节点,该节点就是u、v的最近公共祖先,记作LCA(u,v)。若较深的节点u到达v的同一深度时,那个节点正好是v,则v节点为LCA(u,v)。 3.算法分析 以暴力搜索法求解LCA,两种方法的时间复杂度在最坏情况下均为O(n)。
LCA最近公共祖先 LCA:树上两个结点的最近公共祖先适用于求树上某条路径相关的一些问题返回顶部 方法一:暴力求解原理:对于已知每个结点的父亲结点的树,要求x和y的LCA,首先让深度更深的结点,此处不妨设为y,向上跳到与x同样的深度,然后两个结点再同时往上跳,直至重合,这个重合的结点就是x和y的LCA。
LCA(Least Common Ancestors),即最近公共祖先,是指在有根树中,找出某两个结点u和v最近的公共祖先。 对于有根树T的两个结点u、v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u、v的祖先且x的深度尽可能大。 另一种理解方式是把T理解为一个无向无环图,而LCA(T,u,v)即u到v的最短路上深度最小的点...
1. LCA(最近公共祖先) 倍增算法的基本思想在前面的博文中有较详细的介绍,本文不再复述。此文仅讲解如何使用倍增算法求解多叉树中节点之间的最近公共祖先问题。 什么是最近公共祖先问题? 字面而言,指在树上查询两个(也可以是两个以上)节点的祖先,且是离两个节点最近的祖先。如下图所示: ...
1. LCA(最近公共祖先) 倍增算法的基本思想在前面的博文中有较详细的介绍,本文不再复述。此文仅讲解如何使用倍增算法求解多叉树中节点之间的最近公共祖先问题。 什么是最近公共祖先问题? 字面而言,指在树上查询两个(也可以是两个以上)节点的祖先,且是离两个节点最近的祖先。如下图所示: ...
算法流程 例题:【模板】最近公共祖先(LCA) - 洛谷 树链剖分(重链剖分) 例题:P3379 【模板】最近公共祖先(LCA) 实现过程 练习 什么是LCA(能吃吗?) 给定一颗树,若节点 z 既是 节点 x 的祖先, 也是节点 y 的祖先,那么称 z 为 x、y 的公共祖先。 在x、y 的所有公共祖先中,深度最大的一个称为 x、...
1. LCA(最近公共祖先) 倍增算法的基本思想在前面的博文中有较详细的介绍,本文不再复述。此文仅讲解如何使用倍增算法求解多叉树中节点之间的最近公共祖先问题。 什么是最近公共祖先问题? 字面而言,指在树上查询两个(也可以是两个以上)节点的祖先,且是离两个节点最近的祖先。如下图所示: ...