在考虑编写实现它的功能之前,我试着想一个算法。 h表示主要父节点与给定节点之间的最大距离。它应该以o(h ^ 2)运行,这意味着应该更容易想出这样的算法,但我经常发现自己使用o(h)算法。当我理解我是否正在进行h ^ 2操作时,我也感到困惑。我真的可以使用铅。
答案 0 :(得分:2)
最简单的LCA算法将在O(h^2)
中运行 - 制作两个嵌套循环,一个在第一个顶点的所有祖先上运行,另一个在第二个顶点的所有祖先上运行,在循环内部只是比较它们。 / p>
a1 = a // a is the first given vertes
while a1 != nil // assume root's parent is nil
a2 = b // b is the second given vertex
while a2 != nil
if (a1 == a2)
compare with current-best solution
a2 = a2.parent
a1 = a1.parent
所以,从第一个给定的顶点开始,即通过它的所有祖先。对于它的每个祖先a1
,从第二个给定的顶点到根,检查你是否在路上遇到a1
顶点。