美文网首页数据结构与算法
最全最清晰的最近公共祖先LCA讲解

最全最清晰的最近公共祖先LCA讲解

作者: Shadowsocks2 | 来源:发表于2017-12-16 06:09 被阅读35次

题目:求两个节点的最近公共祖先 LCA(Latest Common Acestor)
输入为两个节点:a,b。

Situation :BST

对于BST, ancestor.value > a.value && ancestor.value < b.value。

Situation :Common BT + store parent

基本思想:分别从给定的两个节点出发上溯到根节点,形成两条相交的链表,问题转化为求这两个相交链表的第一个交点,即传统方法:求出linkedList A的长度lengthA, linkedList B的长度LengthB。然后让长的那个链表走过abs(lengthA-lengthB)步之后,齐头并进,就能解决了。

Situation: Common BT

三种常见的做法:对于简单的模拟题——直接模拟就好了;对于大题目中的求最近公共祖先的小桥段——用tarjan来求,因为好打不容易错;对于特意考察最近公共祖先,并且数据范围比较大的时候——用在线算法倍增算法,省空间还是硬道理。

深搜+压栈

深度优先遍历得到两个序列(数组),取数组最前面的公共部分的最后一个元素就是最近公共祖先。

数组优化为栈型队列,后遍历到的元素在栈的上面,这样方便找到第一个公共元素。(将本来的找最后一个公共元素变成找第一个公共元素 。)

想法二:先将树转为双向链表,代价可能比较大

教科书答案:树上(一次向上跳2^i个点)倍增求LCA

相关文章

  • 最全最清晰的最近公共祖先LCA讲解

    题目:求两个节点的最近公共祖先 LCA(Latest Common Acestor)输入为两个节点:a,b。 Si...

  • LCA_最近公共祖先

    LCA 最近公共祖先在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上...

  • LCA(最近公共祖先)算法

    在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上深度最大的公共的祖先...

  • LCA问题及其倍增解法

    [TOC] LCA,最近公共祖先 在有根树中,找出某两个结点u和v最近的公共祖先(或者说,离树根最远的公共祖先)。...

  • 最近公共祖先

    最近公共祖先 简称LCA(Lowest Common Ancestor),所谓LCA,是当给定一个有根树T时,对于...

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

    lca最近公共祖先,是指两个点最近的祖先节点;求lca我知道的有三种倍增,st表,tarjan,我要介绍的是倍增,...

  • 最近公共祖先系列

    最近公共祖先I 描述: 给定一棵二叉树,找到两个节点的最近公共父节点 (LCA)。最近公共祖先是两个节点的公共的祖...

  • 论二进制与lca的关系

    首先我们先回顾下什么叫LCA LCA:树上两个点之间距离最近的公共祖先 在ACM比赛中常常是出现LCA的题目,而求...

  • lintcode 最近公共祖先

    给定一棵二叉树,找到两个节点的最近公共父节点(LCA)。最近公共祖先是两个节点的公共的祖先节点且具有最大深度。样例...

  • LCA倍增 模板

    LCA倍增 最近公共祖先 构造 NlogN 查询 ogN 先调用pre()构造对数数组 再调用dfs(root, ...

网友评论

    本文标题:最全最清晰的最近公共祖先LCA讲解

    本文链接:https://www.haomeiwen.com/subject/ngnjwxtx.html