Задний план
Бинарное дерево является внедренным деревом, каждый узел имеет не более двух детей.
Меченное бинарное дерево представляет собой бинарное дерево, каждый узел обозначен с положительным целым числом; Более того, все ярлыки различны .
БСТ (бинарное дерево поиска) представляет собой меченый бинарное дерево , в котором метка каждого узла больше , чем этикетках всех узлов в левом поддереве, и меньше , чем этикетках всех узлов в его правого поддерева. Например, следующее является BST:
Обход предварительного порядка для помеченного двоичного дерева определяется следующим псевдокодом.
function preorder(node)
if node is null then
return
else
print(node.label)
preorder(node.left)
preorder(node.right)
Смотрите следующее изображение, чтобы получить лучшую интуицию:
Вершины этого двоичного дерева печатаются в следующем порядке:
F, B, A, D, C, E, G, I, H
Вы можете прочитать больше о BST здесь и больше о предварительном заказе здесь .
Вызов
Учитывая список целых чисел , ваша задача состоит в том, чтобы определить, существует ли BST, чей обход при предварительном заказе печатает ровно .
вход
- Непустой список различных положительных целых чисел .
- Опционально, длина .
Выход
- Truthy значение , если является предзаказ обход некоторых BST.
- Falsey значение в противном случае.
правила
- Применяются стандартные правила для действительных представлений , ввода / вывода , лазеек .
- Это код-гольф , поэтому выигрывает самое короткое (в байтах) решение . Как обычно, не позволяйте смехотворно коротким решениям на языках игры в гольф отговаривать вас публиковать более длинные ответы на выбранном вами языке.
- Это не правило, но ваш ответ будет лучше принят, если он будет содержать ссылку для проверки решения и объяснение того, как оно работает.
Примеры
Input ----> Output
[1] ----> True
[1,2,3,4] ----> True
[5,1,4,2,3] ----> True
[5,4,3,2,1,6,7,8,9] ----> True
[4,2,1,3,6,5,7] ----> True
[8,3,1,6,4,7,10,14,13] ----> True
[2,3,1] ----> False
[6,3,2,4,5,1,8,7,9] ----> False
[1,2,3,4,5,7,8,6] ----> False
[3,1,4,2] ----> False
Проверьте эту ссылку (любезно предоставлено Кевином Круйссеном ), чтобы наглядно увидеть примеры.
источник
Ответы:
JavaScript (Node.js) , 49 байт
Попробуйте онлайн!
Благодаря Арно , сэкономьте 1 байт.
источник
Желе , 7 байт
Попробуйте онлайн!
Возвращает
[4]
для обходов, в противном случае[]
.По сути, используется алгоритм tsh: условие «дисквалификации» для обхода предварительного заказа - это подпоследовательность из 3 элементов, которая выглядит как [средний, высокий, низкий] . (Например, [20, 30, 10].)
Мы то же самое проверить любые подпоследовательности любой длины , которые имеют индекс 4 в их списках перестановок, которые все списки сортируются как [а 1 ... A к CDB] , где я сортирую и я <Ь <с <d . (Каждый такой список дисквалифицирует, если мы посмотрим на последние три элемента, и каждый дисквалифицирующий список, очевидно, имеет такую форму.)
доказательство
источник
Java 10, 94 байта
Порт @tsh 'JavaScript ответа .
Попробуйте онлайн.
Объяснение:
источник
|=
. Я полагаю,&=
будет работать?|=
и&=
работают как ярлыки дляb = b | condition
иb = b & condition
(где&
и|
,&&
и,||
конечно же, ярлыки для и в большинстве случаев).Рубин ,
46 4038 байтПопробуйте онлайн!
Это работает путем рекурсивного принятия первого элемента
a
в качестве точки поворота и проверки, можно ли разбить оставшуюся часть массива на две части (используя пересечение и объединение: сначала удалите все элементы> a, затем добавьте их снова справа и проверьте, что-то изменено).источник
Сетчатка 0.8.2 , 31 байт
Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Использует алгоритм @ tsh. Объяснение:
Преобразовать в одинарный.
Найти числа, которые лежат между двумя последовательными по убыванию числами.
Убедитесь, что количество совпадений равно нулю.
источник
Perl 6 , 38 байт
Попробуйте онлайн!
объяснение
источник
Haskell , 50 байтов
Попробуйте онлайн!
источник
Скала (
6867 байт)Попробуйте онлайн
Порт ответа @ nwellnhof .
Scala (
122103 байта)Спасибо @Laikoni за предложения сделать оба решения короче.
Попробуйте онлайн
Объяснение:
span
) массив, используя в качестве критерия нарезки заголовок массива.источник
val (s,t)
,true
может быть,1>0
и вы можете бросить, такs.forall(_<i(0))&
как это должно быть уже застрахованоspan
.%
и сбросить пробел:def%(i:Seq[Int])=
l.zipWithIndex.foldLeft(1>0){case(r,v,i)=>r&l.zip(l.tail).slice(i+1,l.length).forall(x=>l(i)>x._1|l(i)<x._2)}
. Версия 2(for(i<-l.indices)yield l.zip(l.tail).slice(i+1,l.length).forall(x =>l(i)>x._1|l(i)<x._2)).forall(x=>x)
.. Есть идеи как сделать их короче?05AB1E ,
1510 байтПорт @Lynn 's Jelly ответа .
-5 байт благодаря @Emigna .
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение: "
источник
ŒεD{3.IÊ}P
?Haskell , 41 байт
Попробуйте онлайн!
Использует наблюдение Линн о том, что достаточно проверить, что нет подпоследовательности для mid..high..low . Это означает, что для каждого элемента
h
список элементов,t
который следует после, является блоком элементов,<h
за которым следует блок элементов>h
(оба блока могут быть пустыми). Итак, код проверяет, что после удаления префикса элементов<h
вt
оставшиеся элементы все>h
. Повторяющиеся проверяют это для каждого начального элемента,h
пока список не станет длиной 1.Потенциальное упрощение состоит в том, что достаточно проверить субпаттерны в середине ... высоко, низко, где последние два последовательны. К сожалению, у Haskell нет короткого способа извлечь последние два элемента, как это можно сделать спереди с помощью сопоставления с образцом
a:b:c
. Я нашел более короткое решение, которое проверяет средний, высокий .. низкий , но это не в состоянии отклонить входные данные, как[3,1,4,2]
.Отформатированные тестовые наборы взяты из Laikoni .
источник
Japt , 14 байт
Japt Переводчик
Выходы
false
для BST,true
без BST.Объяснение:
источник
Scala
Все подходы являются реализациями правила, показанного в tsh.
109
101
98
78
Если это должна быть функция, а не просто выражение, то каждая строка должна начинаться с (17 байт)
источник
Oracle SQL, 177 байт
Поскольку в Oracle SQL логический тип отсутствует, запрос возвращает 1 или 0.
Oracle SQL 12c, 210 байт
Не возможно получить доступ к элементу массива в SQL так же, как в PL / SQL - то есть a (i), таким образом, функция
f
была объявленаwith clause
для этой цели. В противном случае решение было бы намного короче.Другие ограничения
листинг sqlplus
Онлайн проверка apex.oracle.com
Обновить
Oracle SQL, 155 байт
источник
C 823 байта (не считая пробельных символов); 923 байта (включая пробелы)
Читаемая версия программы ниже:
Основной метод в этой программе читает список чисел, которые (предположительно) являются законным обходом предварительного заказа.
Вызываемая функция insert_root вставляет целые числа в двоичное дерево поиска, где предыдущие узлы содержат меньшие значения, а следующие узлы содержат большие значения int.
Функция preorder (root) обходит дерево в обходе preorder и одновременно объединяет каждое целое число, которое алгоритм находит в массиве int находит в test_list .
Последний цикл while проверяет , эквивалентны ли каждое из значений int в списке stdin и значений в test_list для каждого индекса. Если есть элемент списка из stdin, который не соответствует соответствующему элементу в test_list по соответствующему индексу, функция main возвращает 0. Иначе метод main возвращает 1 .
Чтобы определить, что вернуло main, наберите echo $ status в терминале bash. BASH либо распечатает 1 или 0.
источник