Восстановление бинарного дерева

224
06 мая 2018, 21:41

Теорема: Бинарное дерево можно однозначно восстановить имея InOrder и PostOrder/PreOrder последовательности, если последовательности не содержат дубликатов.

Есть идеи, каким образом можно это дело реализовать, то есть восстановить бДерево имея на входе две последовательности?

Answer 1

Приведу ответ с одного сайта:

Если одним префиксным/инфиксным/постфиксным — то, разумеется, нет. А если двумя — дело уже интереснее (при условии, разумеется, что все узлы разные). Ну, например, как восстановить дерево, которое было пройдено сначала префиксно, потом постфиксно (самый сложный и интересный случай). Признаюсь сразу: полное восстановление невозможно, ведь ситуации «без левых сыновей» и «без правых сыновей» различить нельзя.

Если длины не совпадают, СТОП: некорректные данные.
В префиксном обходе корень в начале, в постфиксном — в конце. Если они не одинаковы, СТОП: некорректные данные.
Если в обходе один элемент — с этим всё понятно.
Второй элемент префиксного обхода — левый сын. Ищем его в постфиксном обходе. Если он предпоследний — перед нами та самая ситуация «у дерева один сын», и рекурсивно запускаем алгоритм на обходах без корня. В противном случае выкусываем подстроки нужной длины (реально или виртуально), дважды запускаем алгоритм рекурсивно.

Пример: у нас дерево.
a
/\
b c
/\ /
d e f
Префиксный обход abdecf, постфиксный debfca. Корень a, левый сын b, он в постфиксном обходе на третьей позиции. Рекурсивно запускаем алгоритм на парах bde/deb и cf/fc.

Answer 2

Можно решать рекурсивно, для случая In+Post передавая аргументы InLeft, InRight, PostRoot

Обработать случаи InLeft>InRight (обрыв рекурсии) и InLeft=InRight - вывод листового элемента.

Найти в In элемент In[RootIndex] = Post[PostRoot] и вывести узловой элемент In[RootIndex] Запустить рекурсию для его поддеревьев в диапазонах левее и правее RootIndex, с использованием корней поддеревьевPostRoot-1 и PostRoot-RootIndex

Для случая In+Pre всё будет похоже, за исключением корня слева и подкорней правее

READ ALSO
Анимация при прокрутке RecyclerView вниз

Анимация при прокрутке RecyclerView вниз

Использую анимацию при прокрутке RecyclerView

235
Selenium WebDriver. Java. Поиск не выдаёт все значения.

Selenium WebDriver. Java. Поиск не выдаёт все значения.

Начал изучать Selenium WebDriverНад одной проблемой уже два дня голову ломаю

208
Как подключится к сторонней встроенной Database H2

Как подключится к сторонней встроенной Database H2

У меня есть программа , в которой есть своя встроенная (Embedded H2) databaseЯ могу подключиться к ее консоли находясь непосредственно в самой программе

267
Как правильно вынести блок кода в поток

Как правильно вынести блок кода в поток

В моей программе есть блок кода, отвечающий за открытие новостной статьи и извлечение из неё адреса картинкиЭтот блок кода находится в потоке,...

204