http://en.wikipedia.org/wiki/Lowest_common_ancestor содержит указатели на более эффективные алгоритмы для наименьшей общей проблемы предков в (обычном) случае, когда у нас есть дерево, поэтому у каждого узла есть один родительский элемент, за исключением корневого узла, у которого нет родительского элемента,Эти алгоритмы могут отвечать на запросы в постоянное время, после линейной предварительной обработки дерева.
Я не знаю, будет ли какой-либо из этих алгоритмов обобщен на случай, когда у вас может быть более одного родителя.Похоже, что очевидные обобщения будут равносильны удалению ссылок в вашем дереве, чтобы убедиться, что, хотя он все еще подключен, каждый узел имеет не более одного родителя.