Tarjan's off-line lowest common ancestors algorithm
In computer science, Tarjan's off-line lowest common ancestorsalgorithm is an algorithm for computing lowest common ancestors for pairs of nodes in a tree, based on the union-find data structure. The lowest common ancestor of two nodes d and e in a rooted treeT is the node g that is an ancestor of both d and e and that has the greatest depth in T. It is named after Robert Tarjan, who discovered the technique in 1979. Tarjan's algorithm is an offline algorithm; that is, unlike other lowest common ancestor algorithms, it requires that all pairs of nodes for which the lowest common ancestor is desired must be specified in advance. The simplest version of the algorithm uses the union-finddata structure, which unlike other lowest common ancestor data structures can take more than constant time per operation when the number of pairs of nodes is similar in magnitude to the number of nodes. A later refinement by speeds the algorithm up to linear time.
Pseudocode
The pseudocode below determines the lowest common ancestor of each pair in P, given the root r of a tree in which the children of node n are in the set n.children. For this offline algorithm, the set P must be specified in advance. It uses the MakeSet, Find, and Union functions of a disjoint-set forest. MakeSet removes u to a singleton set, Find returns the standard representative of the set containing u, and Union merges the set containing u with the set containing v. TarjanOLCA is first called on the root r. function TarjanOLCA is MakeSet u.ancestor := u for each v in u.children do TarjanOLCA Union Find.ancestor := u u.color := black for each v such thatin P do if v.color black then print "Tarjan's Lowest Common Ancestor of " + u + " and " + v + " is " + Find.ancestor + "." Each node is initially white, and is colored black after it and all its children have been visited. For each node pair ' to be investigated:
When v is already black : After u is colored black, the lowest common ancestor of this pair is available as Find.ancestor, but only while the LCA of u and v is not colored black.
Otherwise: Once v is colored black, the LCA will be available as Find.ancestor, while the LCA is not colored black.For reference, here are optimized versions of MakeSet, Find, and Union for a disjoint-set forest: function MakeSet is x.parent := x x.rank := 1
function Union is xRoot := Find yRoot := Find if xRoot.rank > yRoot.rank then yRoot.parent := xRoot else if xRoot.rank < yRoot.rank then xRoot.parent := yRoot else if xRoot.rank yRoot.rank then yRoot.parent := xRoot xRoot.rank := xRoot.rank + 1
function Find is if x.parent != x then x.parent := Find return''' x.parent