Предполагая, что вам нужно решить проблему только один раз (для каждого набора данных), тогда простой подход состоит в том, чтобы собрать набор предков из одного узла (вместе с самим собой), а затем пройти список предков от другого, пока не найдете член вышеприведенного набора, который обязательно является наименьшим общим предком. Псевдокод для этого дан:
Let A and B begin as the nodes in question.
seen := set containing the root node
while A is not root:
add A to seen
A := A's parent
while B is not in seen:
B := B's parent
B is now the lowest common ancestor.
Другой метод состоит в том, чтобы вычислить полный путь к комнате для каждого узла, а затем сканировать справа, ища общий суффикс. Его первый элемент - LCA. Какой из них быстрее, зависит от ваших данных.
Если вам понадобится найти LCA для многих пар узлов, вы можете сделать различные компромиссы между пространством и временем:
Вы можете, например, предварительно вычислить глубину каждого узла, что позволит вам избежать повторного создания наборов (или путей) каждый раз, сначала пройдя от более глубокого узла к глубине более мелкого узла, и затем пошлите два узла к корню в шаге блокировки: когда эти пути встречаются, у вас есть LCA.
В другом подходе аннотируются узлы с их следующим предком на глубине mod-H, так что вы сначала решаете аналогичную, но в разы меньшую проблему, а затем экземпляр первой проблемы размера H. Это хорошо для очень глубоких деревьев, и H обычно выбирается как квадратный корень средней глубины дерева.