Это будет зависеть от некоторых более тонких определений, например, если у ребер есть обратные ссылки.Тогда это легко, потому что вы можете просто перейти по обратной ссылке вверх по дереву.В противном случае я не могу придумать способ сделать это без O (lg количество узлов ) пробела, потому что вам нужно запомнить хотя бы узлы "выше".
Обновление
Ой, подождите, конечно, это можно сделать в O (1) space с пространственно-временной сделкой.Везде, где вы хотите создать обратную ссылку, вы сохраняете свое место и выполняете BFS, отслеживая самый последний узел, пока не найдете свой.Затем вернитесь к последнему посещенному узлу и продолжайте.
Проблема в том, что это O (1) пробел, но O (n ^ 2) время.
Другое обновление
Давайте предположим, что мы достигли узла n_i, и мы хотим связаться с родителем этого узла, который мы назовем wlg n_j.Мы определили выделенный корневой узел n_0.
Изменим алгоритм поиска по первому дыханию так, чтобы, когда он следует за направленным ребром (n_x, n_y), сохранялся эфферентный или «входящий» узел.Таким образом, когда вы следуете (n_x, n_y), вы сохраняете n_x.
Когда вы снова запускаете BFS из n_0, вы гарантированно (предполагая, что это действительно дерево), что в НЕКОТОРОЙ точке вы перейдете край(n_j, n_i).В этот момент вы замечаете, что вернулись в n_i.Вы сохранили n_j, и, таким образом, вы знаете, что обратный край равен (n_i, n_j).
Таким образом, вы получаете этот единственный возвратный путь только с двумя дополнительными ячейками, одна для n_0 и одна для «сохраненного» узла.Это O (1)
Я не очень уверен в O (n ^ 2) - уже поздно, и это был тяжелый день, поэтому я не хочу сочинять доказательства.Я уверен, что это O ((| N | + | E |) ^ 2) где | N |и | E |являются размерами наборов вершин и ребер соответственно.