LCA(最近公共祖先)算法

2017-07-25  本文已影响0人  Joseph_Z

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

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。

伪代码:

上一篇下一篇

猜你喜欢

热点阅读