使用 o(h^2) 在二叉树中查找最小共同祖先以进行更改
Finding least Common ancestor in Binary Tree with o(h^2) for a change
在考虑写一个函数来实现它之前,我试着想一个算法。 h 表示主父节点与给定节点之间的最大距离。它应该 运行 in o(h^2) 这意味着想出这样的算法应该更容易,但我经常发现自己使用 o(h) 算法。在理解我是否真的在进行 h^2 操作时,我也会感到困惑。我真的可以使用线索。
最简单的 LCA 算法将 运行 in O(h^2)
— 进行两个嵌套循环,一个 运行ning 遍历第一个顶点的所有祖先,另一个 运行ning在第二个的所有祖先上,在循环内比较它们。
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
个顶点。
在考虑写一个函数来实现它之前,我试着想一个算法。 h 表示主父节点与给定节点之间的最大距离。它应该 运行 in o(h^2) 这意味着想出这样的算法应该更容易,但我经常发现自己使用 o(h) 算法。在理解我是否真的在进行 h^2 操作时,我也会感到困惑。我真的可以使用线索。
最简单的 LCA 算法将 运行 in O(h^2)
— 进行两个嵌套循环,一个 运行ning 遍历第一个顶点的所有祖先,另一个 运行ning在第二个的所有祖先上,在循环内比较它们。
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
个顶点。