Преобразовать предварительный порядок двоичного дерева в обратный и наоборот

Как я могу найти список предварительного заказа дерева, если дан только список обратного заказа, и наоборот. Кроме того, в дереве у каждого нелистового узла есть два дочерних элемента (т. е. у каждого узла есть либо два, либо ноль дочерних элементов).

РЕДАКТИРОВАТЬ: Еще одно предположение заключается в том, что метка каждого узла уникальна и имеет поле, которое идентифицирует его как внутренний узел или лист. Я думаю, что это должно избавиться от двусмысленности, связанной с тем, что одиночный предварительный или постзаказ может однозначно идентифицировать дерево.


person Jaelebi    schedule 02.08.2009    source источник


Ответы (3)


Не предполагая, что узлы в дереве имеют поле, которое идентифицирует себя как внутреннее или листовое, вы не сможете найти уникальный ответ на свой вопрос. Это предположение или упорядоченный список должны быть доступны для поиска уникального дерева. В этом случае, чтобы найти один возможный ответ, вы можете построить дерево формы, показанной ниже, чтобы соответствовать любому данному листингу в обратном порядке: (предположим, что список в обратном порядке: 1 2 3 4 5 6 7 8 9)

9[7[5[3[1,2],4],6],8]

Теперь вы можете сделать предварительный заказ, используя это дерево.

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

  1. Проведите сканирование с начала списка обратного порядка и найдите первый внутренний узел. У этого узла будет ровно два дочерних листа, которые предшествуют этому узлу в листинге в обратном порядке.
  2. В вашей древовидной структуре добавьте этот внутренний узел и сделайте два предыдущих узла в списке его дочерними элементами.
  3. Удалите этих двух дочерних элементов из списка и сделайте этот внутренний узел листом.
  4. Перейдите к шагу 1 и повторяйте, пока список не станет пустым.
person Mohammad Alinia    schedule 02.08.2009
comment
Это было бы правильно для обычного бинарного дерева. Но я смотрю на двоичное дерево, в котором каждый узел имеет 0 или 2 дочерних элемента. Я думаю, что это делает списки предзаказа и постзаказа уникальными. - person Jaelebi; 03.08.2009
comment
Нет, это не сделает его уникальным. Рассмотрим этот пример: 5[1,4[2,3]] и 5[3[1,2],4]. Обход обоих деревьев в прямом порядке приводит к 1 2 3 4 5. - person Mohammad Alinia; 03.08.2009
comment
Что, если бы у узла было поле, способное идентифицировать себя как лист или внутренний узел? - person Jaelebi; 03.08.2009

Рассмотрим рекурсивную структуру обхода предварительного порядка:

T(r) = [r, T(r->left), T(r->right)]
where T(r) is the preorder traversal of tree rooted at node r

Тогда мы знаем, что корень дерева, описываемого T(r), всегда является первым узлом в обходе.

Зная это и зная, что корень всегда выше в дереве, чем его поддеревья, подумайте, как бы вы использовали эту информацию для перестроения дерева. Думайте рекурсивно.

Предостережение: это можно сделать только в том случае, если это бинарное дерево поиска, которое ограничивает число узлов таким образом, что left-child < root < right-child. Как правило, деревья не могут быть восстановлены за один проход. См. этот превосходный ресурс для получения более подробной информации. .

Неоднозначность все еще существует независимо от правила об 0 или 2 дочерних элементах:

    4
   / \
  2   5
 / \ / \
 1 3 6 7

    4
   / \
  2   7
 / \
1   3
   / \
  5   6

Оба имеют предварительный обход [4 2 1 3 5 6 7]

person alanlcode    schedule 02.08.2009
comment
Деревья в примере имеют узлы, у которых есть только 1 дочерний элемент. Интересующие меня деревья имеют узлы либо с 0 дочерними элементами, либо с двумя дочерними элементами. Ни один узел не может иметь только 1 потомка. Так что проблемы двусмысленности здесь быть не должно. - person Jaelebi; 03.08.2009
comment
Я отредактировал свой ответ, чтобы показать контрпример, доказывающий, что двусмысленность все еще существует. - person alanlcode; 03.08.2009
comment
Вы должны распечатать обход в обратном порядке для обоих деревьев, чтобы доказать неоднозначность, поскольку сравниваются только обходы. - person Kenan E. K.; 03.08.2009
comment
Что, если бы у каждого узла было поле, способное идентифицировать себя как лист или внутренний узел? - person Jaelebi; 03.08.2009
comment
@Jaelebi - да, тогда это сработает. Помимо интересного, вы можете реконструировать дерево, если у вас был обход до и после заказа - насколько я помню. - person nlucaroni; 03.08.2009

Например: вам необходимо преобразовать форму постзаказа в форму предзаказа. Это можно сделать следующим образом. почтовый заказ: DEBBCA предварительный заказ: ABDECF мы видим, что A является корнем. и из предварительного порядка мы можем определить, что узел B остается для A. Поэтому мы создаем два подкласса, которые являются (BED) (CF). Теперь, когда мы пересекаем B, мы берем его как корень, и мы видим, что после B, D ПРИСУТСТВУЕТ , это означает, что D находится слева от B, а E справа от B. Теперь мы пересекаем C. Примем его за корень. Тогда F присутствует после C, поэтому он считается левым.

person anjali kumari    schedule 12.03.2014