Как мне построить небинарное дерево на основе обхода предварительного и незавершенного или поступорядоченного и неупорядоченного обхода?

Два упражнения для моего класса структур данных и алгоритмов звучат так

Постройте дерево, обход которого перед порядком составляет: 1, 2, 5, 3, 6, 10, 7, 11, 12, 4, 8, 9, а обход инодера равен 5, 2, 1, 10, 6, 3, 11, 7, 12, 8, 4, 9.

Постройте дерево, обход которого будет равен: 5, 2, 10, 6, 11, 12, 7, 3, 8, 9, 4, 1, а обход инодера равен 5, 2, 1, 10, 6, 3, 11, 7, 12, 8, 4, 9.

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


person Tudor Ciotlos    schedule 18.04.2013    source источник
comment
Да, это имело бы смысл ... но это одна из возможных тем для моего промежуточного экзамена.   -  person Tudor Ciotlos    schedule 18.04.2013
comment
Вы на 100% уверены, что это не бинарные деревья? Если бы я был на вашем месте, я бы просто предположил, что они есть, поскольку это требование по порядку.   -  person Bernhard Barker    schedule 18.04.2013
comment
Несколько полезных замечаний - первый узел является предварительным, а последний узел в пост-заказе всегда является корневым. Второй и предпоследний узлы являются одними из дочерних узлов корня, вы можете определить, какой из них, посмотрев на их отношение к корню в обходе по порядку.   -  person Bernhard Barker    schedule 18.04.2013
comment
Я уверен, что дерево должно выглядеть так: i.imgur.com/RESf0kk.png   -  person Tudor Ciotlos    schedule 18.04.2013
comment
Вы можете определить обход по порядку для общих деревьев. Почему бы нам просто не позволить Тюдору рассказать нам об определении своего класса для обхода пост / до / информера и посмотреть, совместимо ли это с общими (конечными) деревьями? Кроме того, вопрос не указывает, является ли дерево двоичным деревом или нет? Что, если вы все равно (попытаетесь) построить двоичное дерево?   -  person rliu    schedule 18.04.2013
comment
Определение обходов предзаказов и обходов из лекции: i.imgur.com/6puTTkh.png. Это можно применить, когда дерево уже нарисовано, и мне нужно выполнить обход. Когда дан обход и запрошено дерево, решением может быть предположение, что оно двоичное, как вы сказали.   -  person Tudor Ciotlos    schedule 18.04.2013
comment
@Turdor Ciotlos. Вы можете преобразовать дерево в вашем изображении в двоичное дерево, удовлетворяющее условиям. Просто переместите поддерево с корнем 4 в правый дочерний элемент 12. Почему вы решили, что это не может быть двоичное дерево?   -  person rliu    schedule 18.04.2013


Ответы (1)


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

Во-первых, подумайте, как обход дерева пересекает дерево. Если вы нарисуете дерево так, чтобы крайний левый дочерний элемент находился слева (визуально), а другие дочерние элементы - справа (визуально), то обход по порядку идет слева направо. Вы можете столкнуться с проблемой, когда оно не совсем слева направо (из-за некоторого перекрытия между дочерним элементом одного узла и родителем или что-то в этом роде), но вы всегда можете растянуть дерево, чтобы оно было четко «слева направо». Итак, я воспользовался этим, начав свое дерево с обхода в порядке:

5 2 1 10 6 3 11 7 12 8 4 9

Тогда идея состоит в том, что мы перемещаем узлы вверх и вниз в соответствии с обходом предварительного заказа. Эту часть сложно определить. Обычно вы перемещаете узлы вверх, если они посещаются «раньше», и перемещаете их вниз, если они посещаются позже. Так, например, 1 находится слева от 2 и 5 в обходе предварительного заказа, поэтому я поднял его "вверх" в том смысле, что я сделал 2 и 5 предков (но не обязательно дочерних) 1. Итак, что-то вроде

   1
5 2 10 6 3 11 7 12 8 4 9

Затем вы видите 2 перед 5, поэтому я повысил 2:

    1
  2 
5     10 6 3 11 7 12 8 4 9

Затем вы видите, что 3 идет перед 6 и 10 в обходе предварительного заказа, чтобы мы могли его "поднять".

    1
  2        3
5     10 6   11 7 12 8 4 9

И так далее. Обратите внимание, что 3 в конечном итоге может быть дочерним элементом 2 или 1 ... дерево, которое удовлетворяет указанным выше ограничениям, не является уникальным.

person rliu    schedule 18.04.2013
comment
Спасибо! А как насчет почтового и информативного порядка? Я знаю, что корень - это крайний правый элемент обхода постордера, но какие шаги я должен предпринять, чтобы создать дерево? - person Tudor Ciotlos; 18.04.2013
comment
Я на самом деле не пробовал это, но я почти уверен, что вы можете просто инвертировать логику и вытащить ее, если это происходит раньше при обходе постпорядка, чем при обходе без порядка (а не вверх). - person rliu; 18.04.2013