美文网首页数据结构与算法
最全最清晰的最近公共祖先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讲解

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