Построить дерево из краев

У меня есть края, и я хочу построить из них дерево.

Проблема в том, что я могу построить свою древовидную структуру только тогда, когда края расположены в определенном порядке. Пример заказов:

(vertex, parent_vertex)

good:              bad:
(0,  ) <-top       (3, 2)
(1, 0)             (1, 0)
(2, 1)             (3, 2)
(3, 2)             (0,  ) <-top

Я повторяю, выбрасывая ребра, и для текущей вершины пытаюсь найти ее родительский элемент в созданном дереве, затем я создаю узел и вставляю его.

result tree:

0 - 1 - 2 - 3

Таким образом, всегда должен существовать родительский элемент в дереве для новой добавленной вершины. Вопрос в том, как отсортировать входные края. Voices говорит мне о топологической сортировке, но это для вершин. Можно ли правильно отсортировать?


person mirt    schedule 31.07.2012    source источник
comment
Что не так с топологической сортировкой? Если вы отсортируете вершины, ваш список будет правильным.   -  person Beta    schedule 31.07.2012
comment
Если у вас есть края, у вас есть дерево. Единственное, чего вам, кажется, не хватает, так это знания о том, какая вершина является корнем. Как только вы найдете корень (выберите произвольное ребро и начните следовать за родительским), я думаю, что вы ищете предварительный обход дерева.   -  person chepner    schedule 31.07.2012
comment
@Beta, да, вроде работает   -  person mirt    schedule 31.07.2012


Ответы (1)


@mirt спасибо, что указали на оптимизацию моего подхода, у вас есть что-то лучше? Я поставлю приведенный ниже алгоритм для ссылки

сначала создайте хэш-карту для хранения элементов, которые есть в дереве: H, добавьте корень (ноль в вашем случае / или что-нибудь, что представляет этот корень)

взяв пару (_child, _parent)

  1. пройтись по всему списку. в списке. (каждая пара - это элемент)
  2. для каждой пары посмотрите, есть ли _child и _parent в хэш-карте H, если вы не нашли, создайте узел дерева для отсутствующих и добавьте их в H, и свяжите их с родительскими дочерними отношениями.
  3. в конце итерации вы останетесь с деревом.

сложность O (n).

person Dhandeep Jain    schedule 08.08.2012
comment
Вкратце, я сделал это так: поместил все пары в хэш-карту H и перебрал ее. Итак, для каждой пары (C, P) я нахожу C и P в H и связываю их (устанавливаем P как родительский для C и добавляем C как дочерний для P). Так что требуется O (N). - person mirt; 08.08.2012