Является ли алгоритм обхода Эйлера по существу таким же, как обход предварительного заказа?

#data-structures #tree #tree-traversal #graph-traversal #preorder

#структуры данных #дерево #обход дерева #обход графика #предварительный заказ

Вопрос:

Я пытаюсь узнать об алгоритме обхода Эйлера и почему он популярен для обхода дерева. Однако я не вижу разницы между обходом Эйлера и обходом по предварительному заказу дерева.

Допустим, у вас есть дерево:

      A
    / 
   B   E
  /    
 C   D   F
  

Если бы вы выполнили алгоритм обхода Эйлера, это было бы:

 A -> B -> C -> B -> D -> B -> A -> E -> F -> E -> A
  

Но какова цель этого? Это просто похоже на ту же версию рекурсивного предварительного заказа:

 A -> B -> C -> D -> E -> F
  

Очевидно, что в Euler Tour у вас есть значение каждого узла по крайней мере дважды в пути, но это только из-за рекурсивного характера алгоритма при его программировании. Если бы вы хотели, вы могли бы выполнить те же вычисления, которые выполняли с помощью Euler Tour… с предварительным заказом, верно?

Если бы кто-нибудь мог помочь объяснить Euler Tour и почему он используется поверх других обходов, это было бы очень ценно. Спасибо.

Ответ №1:

С помощью обхода Эйлера вы можете получить дополнительную информацию из результата.

Вы можете, например, посмотреть, является ли узел листом. Это имело бы место, если предшественник и преемник узла одинаковы.

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

Эта информация часто полезна при работе с деревьями в ваших алгоритмах.

Ответ №2:

Обратите внимание, что информация о последующем заказе также присутствует в вашем туре Эйлера. Если просто перечислить каждый узел в последний раз, когда он указан, мы получим

 C -> D -> B -> F -> E -> A
  

К сожалению, мы не можем получить inorder (симметричный порядок) из тура. В вашем примере это ясно из рассмотрения узла E и его дочернего F элемента, мы никак не можем увидеть, является ли дочерний элемент левым или правым.

Метод обхода Эйлера можно немного расширить, включив в него три рекурсивных порядка дерева (pre- in- post-). Следуйте контуру дерева и посетите каждый узел три раза, перед вводом левого дочернего элемента, между левым и правым дочерними элементами и после правого дочернего элемента. Если дочерний элемент отсутствует, выполните последовательные посещения.

Мы можем расширить ваш пример следующим образом, добавив числа к вашему предыдущему туру:

 A1 -> B1 -> C123 -> B2 -> D123 -> B3 -> A2 -> E12 -> F123 -> E2 -> A3