Это алгоритм обхода предварительного заказа:
Preorder(T)
if (T is not null)
print T.label
Preorder(T.left)
Preorder(T.right)
Попробуем найти алгоритм для ввода NNLLNL
.
Очевидно, что этикетка корня печатается первой. Итак, вы знаете, что корень имеет метку N
. Теперь алгоритм возвращается на левое поддерево. Это также N
в зависимости от ввода. Рекурсируйте на левом поддереве того, что L
. Теперь вы должны отказаться, потому что вы достигли листа. Следующая позиция на входе также L
, поэтому у текущего узла есть правый дочерний элемент, помеченный L
. Отступить один раз. Снова вернитесь назад, потому что вы добавили все дочерние элементы текущего узла (максимум 2 дочерних элемента). Теперь вы снова в корне. Вы должны идти направо, потому что вы уже пошли налево. Согласно данным, это N
. Таким образом, правым потомком корня является N
. Левый ребенок этого будет L
. Это ваше дерево:
N
/ \
N N
/ \ /
L L L
Обратите внимание, что решение не обязательно уникально, но это даст вам возможное решение.
псевдокод:
k = 0
input = ... get preorder traversal vector from user ...
Reconstruct(T)
if input[k] == N
T = new node with label N
k = k + 1
Reconstruct(T.left)
Reconstruct(T.right)
else
T = new node with label L
T.left = T.right = null
k = k + 1
Вызов с нулевым узлом.
Последующий вопрос : учитывая как предварительный порядок, так и обход по порядку бинарного дерева, содержащего различные метки узлов, как можно уникальным образом восстановить дерево?