fundo
Uma árvore binária é uma árvore enraizada cujo todo nó tem no máximo dois filhos.
Uma árvore binária rotulada é uma árvore binária cujo nó é rotulado com um número inteiro positivo; além disso, todos os rótulos são distintos .
Uma BST (árvore de pesquisa binária) é uma árvore binária rotulada na qual o rótulo de cada nó é maior que os rótulos de todos os nós na subárvore esquerda e menor que os rótulos de todos os nós na subárvore direita. Por exemplo, o seguinte é um BST:
O percurso de pré-ordem de uma árvore binária rotulada é definido pelo pseudo-código a seguir.
function preorder(node)
if node is null then
return
else
print(node.label)
preorder(node.left)
preorder(node.right)
Veja a imagem a seguir para obter uma melhor intuição:
Os vértices dessa árvore binária são impressos na seguinte ordem:
F, B, A, D, C, E, G, I, H
Você pode ler mais sobre BSTs aqui e mais sobre a pré-encomenda de passagem aqui .
Desafio
Dada uma lista de números inteiros , sua tarefa é determinar se existe uma BST cuja passagem de pré-ordem imprima exatamente .
Entrada
- Uma lista não vazia de números inteiros positivos distintos .
- Opcionalmente, o comprimento de .
Saída
- Um valor verdadeiro se é a passagem de pré-ordem de algum BST.
- Um valor falsey caso contrário.
Regras
- Regras padrão para envios válidos , E / S , brechas .
- Esta é a code-golf , a solução mais curta (em bytes) vence. Como sempre, não permita que soluções ridiculamente curtas nos idiomas de golfe o desencorajem a postar uma resposta mais longa no idioma de sua escolha.
- Esta não é uma regra, mas sua resposta será melhor recebida se incluir um link para testar a solução e uma explicação de como ela funciona.
Exemplos
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
Confira este link (cortesia de Kevin Cruijssen ) para dar uma olhada visual nos exemplos.
fonte
Respostas:
JavaScript (Node.js) , 49 bytes
Experimente online!
Usando o fato de que para a matriza0...an−1 , a é a travessia de pré-ordem de algum BST iff ∀0≤i<j<n;ai<aj−1⟹ai<aj mantém.
Graças a Arnauld , economize 1 byte.
fonte
Jelly , 7 bytes
Experimente online!
Retorna
[4]
para travessias, caso contrário[]
.Usa essencialmente o algoritmo do tsh: a condição "desqualificante" para uma travessia de pré-ordem é uma subsequência de 3 elementos que se parecem com [médio, alto, baixo] . (Por exemplo, [20, 30, 10].)
Nós equivalentemente verificar quaisquer subseqüências de qualquer comprimento que têm índice de 4 em suas listas de permutação, que são todas as listas classificadas como [a 1 ... um k cdb] onde o um i são classificadas e um i <b <c <d . (Cada lista desse tipo é desqualificante se olharmos para os três últimos elementos, e cada lista desqualificante é obviamente dessa forma.)
Prova
fonte
Java 10, 94 bytes
Porta da resposta JavaScript @tsh ' .
Experimente online.
Explicação:
fonte
|=
. Eu suponho&=
que também funcionaria?|=
e&=
funcionam como atalhos parab = b | condition
eb = b & condition
(onde&
e|
são atalhos para&&
e||
na maioria dos casos, é claro).Ruby ,
46 4038 bytesExperimente online!
Isso funciona recursivamente, tomando o primeiro elemento
a
como um pivô e verificando se o restante da matriz pode ser dividido em dois (usando interseção e união: primeiro remova todos os elementos> a, adicione-os novamente à direita e verifique se há algo alterado).fonte
Retina 0.8.2 , 31 bytes
Experimente online! O link inclui casos de teste. Usa o algoritmo do @ tsh. Explicação:
Converta para unário.
Encontre números que estejam entre dois números descendentes consecutivos subsequentes.
Verifique se o número de correspondências é zero.
fonte
Perl 6 , 38 bytes
Experimente online!
Explicação
fonte
Haskell , 50 bytes
Experimente online!
fonte
Scala (
6867 bytes)Experimente online
Porto de @ nwellnhof's resposta .
Scala (
122103 bytes)Obrigado a @Laikoni pelas sugestões para reduzir as duas soluções.
Experimente online
Explicação:
span
) a matriz usando a cabeça da matriz como critério de fatia.fonte
val (s,t)
,true
pode ser1>0
e pode soltar,s.forall(_<i(0))&
pois isso já deve estar segurospan
.%
e soltar o espaço: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)}
.. Versão 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)
.. Alguma idéia de como torná-las mais curtas?05AB1E ,
1510 bytesPorto da resposta da @Lynn Jelly .
-5 bytes graças a @Emigna .
Experimente online ou verifique todos os casos de teste .
Explicação: "
fonte
ŒεD{3.IÊ}P
?Haskell , 41 bytes
Experimente online!
Usa a observação de Lynn de que é suficiente verificar se não há subsequência do para meados .. alto .. baixo . Isso significa que, para cada elemento
h
, a lista de elementost
que vem depois é um bloco de elementos<h
seguido por um bloco de elementos>h
(os dois blocos podem estar vazios). Assim, o código verifica que depois de soltar o prefixo de elementos<h
emt
, os restantes elementos são todos>h
. A repetição verifica isso para cada elemento inicialh
até que a lista tenha o comprimento 1.Uma possível simplificação é que basta verificar subpadrões em meados de ... alto, baixo, onde os dois últimos são consecutivos. Infelizmente, o Haskell's não tem um caminho curto para extrair os dois últimos elementos, como pode ser feito de frente com uma correspondência de padrões
a:b:c
. Encontrei uma solução mais curta que verifica a média, a alta .. baixa , mas isso falha em rejeitar entradas como[3,1,4,2]
.Casos de teste formatados retirados de Laikoni .
fonte
Japonês , 14 bytes
Intérprete Japt
Saídas
false
para BST,true
sem BST.Explicação:
fonte
Scala
Todas as abordagens são implementações da regra mostrada pelo tsh.
109
101
98
78
Se deve ser uma função e não apenas uma expressão, cada linha deve começar com (17 bytes)
fonte
Oracle SQL, 177 bytes
Como não há tipo booleano no Oracle SQL, a consulta retorna 1 ou 0.
Oracle SQL 12c, 210 bytes
Não é possível acessar o elemento da matriz no SQL da mesma forma que no PL / SQL - ou seja, a (i), portanto, a função
f
foi declarada emwith clause
para esse fim. Caso contrário, a solução teria sido muito menor.Outras limitações
listagem sqlplus
Verificação online apex.oracle.com
Atualizar
Oracle SQL, 155 bytes
fonte
C, 823 bytes (sem contar os caracteres de espaço em branco); 923 bytes (incluindo espaço em branco)
A versão legível do programa está abaixo:
O método principal deste programa lê a lista de números que são (supostamente) um percurso legítimo de pré-encomenda.
A função insert_root que é chamada insere os números inteiros em uma árvore de pesquisa binária em que os nós anteriores contêm valores menores e os próximos nós contêm valores int maiores.
A função preorder (root) percorre a árvore em um percurso de preorder e concatena simultaneamente cada número inteiro que o algoritmo encontra no array int test_list .
Um loop while final testa se cada um dos valores int na lista stdin e aqueles em test_list são equivalentes em cada índice. Se houver um elemento de lista do stdin que não corresponda ao elemento correspondente em test_list no respectivo índice, a função principal retornará 0. Caso contrário, o método principal retornará 1 .
Para determinar qual principal retornou, digite echo $ status no terminal do bash. O BASH imprimirá 1 ou 0.
fonte