一 点睛

最近公共祖先指有根树中距离两个节点最近的公共祖先。祖先指从当前节点到树根路径上的所有节点。

u 和 v 的公共祖先指一个节点既是 u 的祖先又是 v 的祖先,u 和 v 的最近公共祖先指距离 u 和 v 最近的公共祖先。若 v 是 u 的祖先,则 u 和 v 的公共祖先是 v。

可以使用 LCA 求解树长任意两点之间的距离,求 u 和 v 之间的距离时,若 u 和 v 的最近公共祖先为  lca,则 u 和 v 之间的距离为 u 到树根的距离,加上 v 到树根的距离减去 2 倍的 lca 到树根的距离。

dist[u] + dis[v] - 2 * dist[lca]

求解 LCA 的方法有很多,包括暴力搜索法、树上倍增法、在线 RMQ 算法、离线 Tarjan 算法和树链剖分。

在线算法:以序列化方式一个一个的处理输入,也就是说,在开始时并不知道所有的输入,在解决一个问题后立即输出结果。

离线算法:在开始时,已知问题的所有输入数据,可以一次性回答所有问题。

二 暴力搜索法

暴力搜索法有两种:向上标记法和同步前进法。

1 向上标记法

从 u 向上一直到根节点标记所有经过的节点,若 v 已被标记,则 v 节点为 LCA(u,v) ,否则 v 也向上走一步。第 1 次遇到已标记节点时,该节点为 LCA(u,v)。

2 同步前进法

将 u、v 中较深的节点向上走到深度较浅的节点的同一深度,然后两个节点一起向上走,直到走到同一节点,该节点就是 u 和 v 的最近公共祖先。记作 LCA(u,v)。若较深的节点 u 到达 v 的同一深度时,那个节点正好是 v 则节点,则 v 节点为 LCA(u,v)

3 算法分析

以暴力搜索法求解 LCA,两种方法的时间复杂度在最坏情况下均为 O(n)。

最近公共祖先 LCA相关推荐

  1. POJ 1330 Nearest Common Ancestors / UVALive 2525 Nearest Common Ancestors (最近公共祖先LCA)...

    POJ 1330 Nearest Common Ancestors / UVALive 2525 Nearest Common Ancestors (最近公共祖先LCA) Description A ...

  2. 【C++】最近公共祖先 LCA

    最近公共祖先 百科名片 简单引入 LCA的算法 暴力枚举法 Tarjan离线算法 倍增算法 例题: 题目描述 输入描述 输出描述 样例输入 样例输出 代码 百科名片 最近公共祖先 Lowest Com ...

  3. 最近公共祖先 (LCA) [No. 21]

    问题: 给定一个二叉树,找到两个节点NA, NB的最近公共祖先(LCA). 比如对于下图,4 和 7 的 LCA 是6, 1和13的LCA 是 8. 我们这里先考虑一般的二叉树(BT),然后再考虑这个 ...

  4. 树上倍增法求最近公共祖先LCA

    LCA,最近公共祖先,这个东西有很多作用,因此,如何高效求出LCA就成了一个热点的讨论话题. 下面所有的讨论都以图中这棵树为例子. 先来了解下什么是倍增吧,倍增其实就是二分的逆向,二分是逐渐缩小范围, ...

  5. 图论--最近公共祖先LCA

    最近公共祖先LCA LCA(Least Common Ancestors),即最近公共祖先,是指这样一个问题:在有根树中,找出某两个结点u和v最近的公共祖先(另一种说法,离树根最远的公共祖先) 最近公 ...

  6. 最近公共祖先 LCA Tarjan算法

    来自:http://www.cnblogs.com/ylfdrib/archive/2010/11/03/1867901.html 对于一棵有根树,就会有父亲结点,祖先结点,当然最近公共祖先就是这两个 ...

  7. POJ 1470 Closest Common Ancestors (最近公共祖先LCA 的离线算法Tarjan)

    Tarjan算法的详细介绍,请戳: http://www.cnblogs.com/chenxiwenruo/p/3529533.html #include <iostream> #incl ...

  8. 两节点的最小公共祖先LCA

    一.二叉搜索树中两节点的最小公共祖先: 最初级的题目,在一颗二叉搜索树中寻找两节点的最小公共祖先.根据二叉搜索树的特征,从根节点开始查找,若两节点的val值都小于当前节点,则他们的最小公共祖先就去左子 ...

  9. 与图论的邂逅05:最近公共祖先LCA

    什么是LCA? 祖先链 对于一棵树T,若它的根节点是r,对于任意一个树上的节点x,从r走到x的路径是唯一的(显然),那么这条路径上的点都是并且只有这些点是x的祖先.这些点组成的链(或者说路径)就是x的 ...

  10. 二叉树最近公共祖先 LCA

    题目: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖先且 ...

最新文章

  1. Oracle删除表主键语句
  2. UIImageView 上下和左右翻转 不是旋转
  3. hdu 5246(贪心)
  4. 它们是什么以及为什么我们不需要它们
  5. 【图像处理基础知识】-傅里叶变换
  6. 同事之间关系可以,吃饭喝酒没问题,怎么没有一个说知心话的人?
  7. table中的td表示table data(表格数据),tr表示table row(表格行),th表示table head(表格头)
  8. vue制作echart图表随着画面等比例放大缩小
  9. LOJ2874 JOISC2014 历史研究 分块、莫队
  10. 解决电脑右键新建没有文本文档的问题
  11. fme坐标转换器_利用FME做坐标转换
  12. python获取APP夸克答题助手答案
  13. Firefox downloadhelper 视频下载助手
  14. LENS CRA和SENSOR CRA匹配问题解析
  15. 20159318 《网络攻防实践》第2周学习总结
  16. latex如何设置字体并加粗_LaTex中文字体加粗的问题
  17. PHP项目集成支付宝PC端扫码支付API(国内支付)
  18. 发力数字化转型,容智信息携自研创新科技惊艳亮相2021世界人工智能大会
  19. 基于Python的QQ音乐音频图片搜索系统设计与实现 毕业论文+源码
  20. Alink漫谈(十) :线性回归实现 之 数据预处理

热门文章

  1. uniapp 开发小程序购物车
  2. 计算机图形学 几何概论
  3. cronolog介绍
  4. chubby中文意思
  5. android studio的GearVR应用开发(二)、一个简单的VR app(Oculus官方GearVR开发教程,翻译转载)
  6. 抛弃RPM/DEB,迎接AppImage
  7. 二部图(二分图)总结
  8. Android 5.0学习之动画
  9. php 魔术方法 unset,PHP魔术方法之__iset,__unset详解(代码实例)
  10. SpringBoot下MySQL的读写分离