LCA(最近公共祖先)算法

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

ST在线算法:

ST是基于RMQ区间最大最小值编号的,首先dfs确定3个序列:节点序列、深度序列和首位序列。



tarjan(离线)算法:

基于dfs搜索和并查集的算法,时间复杂度O(N+Q)。

大概过程:

1.任选一个点为根节点,从根节点开始。

2.遍历该点u所有子节点v,并标记这些子节点v已被访问过。

3.若是v还有子节点,返回2,否则下一步。

4.合并v到u上。

5.寻找与当前点u有询问关系的点v。

6.若是v已经被访问过了,则可以确认u和v的最近公共祖先为v被合并到的父亲节点a。

伪代码:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • LCA 最近公共祖先在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上...
    Gitfan阅读 956评论 0 0
  • 归去来兮。 1.1 说明 本篇为《挑战程序设计竞赛(第2版)》[http://www.ituring.com.cn...
    尤汐Yogy阅读 14,480评论 0 160
  • 深度优先搜索 在图中搜索的一般过程为: 记录当前结点被发现的时间(discovery time) 遍历访问未被访问...
    njzwj阅读 1,802评论 0 0
  • 默认样式: 对于可点击的区域,ios和安卓都会对应在标签区域上,增加一个高亮效果 解决方案: 对于页面内可点击的元...
    Dorazzz阅读 593评论 0 0
  • 从毕业就来到这里了,那个时候经理去学校招聘,经过了笔试、面试,没过几天收到了电话通知,说我通过了。其实那个时候已经...
    会眨眼的彼得兔阅读 331评论 0 1