Попереднє замовлення + після замовлення до замовлення


11

Завдання

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

Переходи будуть представлені у вигляді двох списків, обидва містять n чітких натуральних чисел, кожен з яких однозначно ідентифікує вузол. Ваша програма може приймати ці списки та виводити отриманий в результаті прохід по порядку, використовуючи будь-який розумний формат вводу / виводу.

Ви можете припустити, що введення є дійсним (тобто списки фактично представляють обхід якогось дерева).

Це , тому виграє найкоротший код у байтах.

Визначення

Повний бінарне дерево є кінцевою структурою вузлів , представленої тут унікальними позитивними цілими числами.

Повне двійкове дерево - це або листок , що складається з одного вузла :

                                      1

Або гілка , що складається з одного вузла з двома підрядками (звані лівими та правими підтрубками ), кожне з яких, у свою чергу, є повним бінарним деревом:

                                      1
                                    /   \
                                  …       …

Ось повний приклад повного бінарного дерева:

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

Передзамовлення обходу повного двійкового дерева рекурсивно визначається наступним чином :

  • Попереднє обхід аркуша, що містить вузол n, є списком [ n ].
  • Перехід гілки, що містить вузол n та піддерева (L, R), перед замовленням - це список [ n ] +  preorder ( L ) +  preorder ( R ), де + - оператор конкатенації списку.

Для вищевказаного дерева це [6, 3, 1, 8, 2, 9, 4, 5, 7] .


Пост-порядок обходу повного двійкового дерева рекурсивно визначається наступним чином :

  • Поперечний перехід листа, що містить вузол n, є списком [ n ].
  • Перехід гілки, що містить вузол n та під-дерева (L, R) після замовлення, є списком порядок ( L ) +  порядок ( R ) + [ n ].

Для вищевказаного дерева це [1, 2, 9, 8, 3, 5, 7, 4, 6] .


Обхід в замовленні повного двійкового дерева рекурсивно визначаються наступним чином :

  • Порядок обходу аркуша, що містить вузол n, є списком [ n ].
  • Поперечний порядок гілки, що містить вузол n та під-дерева (L, R), є списком inorder ( L ) + [ n ] +  inorder ( R ).

Для вищевказаного дерева це [1, 3, 2, 8, 9, 6, 5, 4, 7] .


На закінчення: дано пару списків [6, 3, 1, 8, 2, 9, 4, 5, 7] (попередньо) та [1, 2, 9, 8, 3, 5, 7, 4, 6] (повідомлення) як вхідна інформація, ваша програма повинна вивести [1, 3, 2, 8, 9, 6, 5, 4, 7] .

Тестові справи

Кожен тестовий випадок у форматі preorder, postorder → expected output.

[8], [8] → [8]
[3,4,5], [4,5,3] → [4,3,5]
[1,2,9,8,3], [9,8,2,3,1] → [9,2,8,1,3]
[7,8,10,11,12,2,3,4,5], [11,12,10,2,8,4,5,3,7] → [11,10,12,8,2,7,4,3,5]
[1,2,3,4,5,6,7,8,9], [5,6,4,7,3,8,2,9,1] → [5,4,6,3,7,2,8,1,9]

Оскільки вхід гарантовано має конкретну форму (повне бінарне дерево), вам не потрібні обидва входи, чи не так?
feersum

Двійкове дерево є повним , але не повним , тому n -елементне дерево може мати багато форм, і взагалі вам потрібно обоє.
Лінн

Чи можу я представити вузли як окремі літери, що дають рядки для замовлень. Наприклад , другий приклад став би: "CDE" and "DEC" give "DCE"? (навіть використовуючи унікодні букви, якщо мені потрібно багато вузлів)
Тон Євангелія,

@TonHospel Я б з цим все гаразд - можливо, все, що ви робите, це трохи розтягнути визначення списку цілих чисел , тому що "CDE"це не дуже відрізняється від [67, 68, 69]:)
Лінн,

Відповіді:


2

Perl, 69 66 62 56 53 байт

Включає +1 для -p

Приймає постпорядку, а потім попереднє замовлення як один рядок, розділений пробілом на STDIN (зверніть увагу на порядок перед і після). Вузли представлені у вигляді унікальних букв (будь-який символ, який не є пробілом або новим рядком, добре).

inpost.pl <<< "98231 12983"

inpost.pl:

#!/usr/bin/perl -p
s%(.)(.)+\K(.)(.+)\3(\1.*)\2%$4$5$3$2%&&redo;s;.+ ;;

Використання оригінально чисто числового формату потребує набагато більше уваги, щоб точно визначити одне число і входить у 73 байти

#!/usr/bin/perl -p
s%\b(\d+)(,\d+)+\K,(\d+\b)(.+)\b\3,(\1\b.*)\2\b%$4$5,$3$2%&&redo;s;.+ ;;

Використовувати як

inpostnum.pl <<< "11,12,10,2,8,4,5,3,7 7,8,10,11,12,2,3,4,5"

-pдодає ;кінець, тож останній вам не потрібен ;. s;.* ;;->s;.* ;
Райлі

@Riley Я знаю. Ось чому я маю ;кінець. Але -p насправді додає \n;до кінця в -eпрограмі. У файл він додається лише ;тоді і лише тоді, коли файл не закінчується \n. Оскільки я хочу претендувати -pяк +1, а не +3, програмі потрібно працювати з командного рядка, так і з -e. І я не хочу, щоб я отримав фальшивий новий рядок у виході, який я отримав би
Тон Євангелія

Якщо ви запускаєте його в командному рядку, вам не потрібно 'навколо нього? Якщо ви запускаєте його так, як у вас є (дзвоніть у файл <<<), ви можете залишити останнє ;.
Райлі

@Riley Це залежить від інтерпретації методу підрахунку балів за perl. Я зазвичай подаю свій код у вигляді файлу, оскільки вважаю, що це менш ефемерно. Але якщо ви подивитесь на мої подання, ви побачите, що якщо код повинен бути у файлі (тому що, наприклад, він має 'або використовує do$0і т.д.), я завжди бачу -pяк +3 (пробіл, мінус, р), але якщо код також буде працювати в командному рядку, де ви отримуєте -eі 'безкоштовно, я +1e
забиваю

Гаразд, мені просто не було зрозуміло, як саме оцінюється подання командного рядка. Я не розумів, що ти отримуєш 'безкоштовно. Дякуємо, що очистили це.
Райлі

3

Haskell, 84 83 байт

(a:b:c)#z|i<-1+length(fst$span(/=b)z),h<- \f->f i(b:c)#f i z=h take++a:h drop
a#_=a

2

JavaScript (ES6), 100 байт

f=(s,t,l=t.search(s[1]))=>s[1]?f(s.slice(1,++l+1),t.slice(0,l))+s[0]+f(s.slice(l+1),t.slice(l)):s[0]

Введення / виведення - це рядки "безпечних" символів (наприклад, літери чи цифри). Альтернативний підхід, також 100 байт:

f=(s,t,a=0,b=0,c=s.length-1,l=t.search(s[a+1])-b)=>c?f(s,t,a+1,b,l)+s[a]+f(s,t,l+2+a,l+1,c-l-2):s[a]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.