Представьте ориентированный ациклический граф следующим образом:
- "A" - это корень (всегда есть ровно один корень)
- каждый node знает своего родителя (ов)
- имена node произвольны - из них ничего нельзя сделать
- мы знаем из другого источника, что узлы были добавлены в дерево в порядке от A до G (например, они совершают ошибку в системе управления версиями)
Какой алгоритм я могу использовать для определения самого низкого общего предка (LCA) двух произвольных узлов, например, общего предка:
- B и E - B
- D и F - B
Примечание:
- Существует не обязательно один путь к данному node из корня (например, "G" имеет два пути), поэтому вы не можете просто пересечь пути от корня к двум узлам и искать последний равный элемент
- Я нашел алгоритмы LCA для деревьев, особенно для двоичных деревьев, но они здесь не применяются, потому что node может иметь несколько родителей (т.е. это не дерево).