Fondo
Un árbol binario es un árbol enraizado cuyos nodos tienen como máximo dos hijos.
Un árbol binario etiquetado es un árbol binario cuyos nodos están etiquetados con un entero positivo; Además, todas las etiquetas son distintas .
Un BST (árbol de búsqueda binario) es un árbol binario etiquetado en el que la etiqueta de cada nodo es mayor que las etiquetas de todos los nodos en su subárbol izquierdo, y más pequeña que las etiquetas de todos los nodos en su subárbol derecho. Por ejemplo, el siguiente es un BST:
El recorrido de preorden de un árbol binario etiquetado se define mediante el siguiente pseudocódigo.
function preorder(node)
if node is null then
return
else
print(node.label)
preorder(node.left)
preorder(node.right)
Vea la siguiente imagen para obtener una mejor intuición:
Los vértices de este árbol binario se imprimen en el siguiente orden:
F, B, A, D, C, E, G, I, H
Puede leer más sobre BST aquí , y más sobre el recorrido de pre-pedido aquí .
Reto
Dada una lista de enteros , su tarea es determinar si hay un BST cuyo recorrido previo al pedido imprime exactamente .
Entrada
- Una lista no vacía de enteros positivos distintos .
- Opcionalmente, la longitud de .
Salida
- Un valor verdadero si es el recorrido de preorden de algunos BST.
- Un valor falso de lo contrario.
Reglas
- Se aplican reglas estándar para envíos válidos , E / S , lagunas .
- Este es el código de golf , por lo que gana la solución más corta (en bytes). Como de costumbre, no permita que soluciones ridículamente cortas en los idiomas de golf lo desalienten a publicar una respuesta más larga en el idioma de su elección.
- Esto no es una regla, pero su respuesta será mejor recibida si incluye un enlace para probar la solución y una explicación de cómo funciona.
Ejemplos
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
Consulte este enlace (cortesía de Kevin Cruijssen ) para tener una visión visual de los ejemplos.
fuente
Respuestas:
JavaScript (Node.js) , 49 bytes
Pruébalo en línea!
Usando el hecho de que para arrayuna0 0. . . unan - 1 , una es el recorrido de preorden de algunos BST iff ∀ 0 ≤ i < j < n ; unayo< aj - 1⟹unayo< aj sostiene.
Gracias a Arnauld , ahorre 1 byte.
fuente
Jalea , 7 bytes
Pruébalo en línea!
Devoluciones
[4]
para recorridos, de lo contrario[]
.Utiliza esencialmente el algoritmo de tsh: la condición de "descalificación" para un recorrido de preorden es una subsecuencia de 3 elementos que se ve como [medio, alto, bajo] . (Por ejemplo, [20, 30, 10]).
Verificamos de manera equivalente cualquier subsecuencia de cualquier longitud que tenga el índice 4 en sus listas de permutación, que son todas listas ordenadas como [a 1 ... a k cdb] donde a i están ordenadas y a i <b <c <d . (Cada una de estas listas es descalificante si observamos los últimos tres elementos, y cada lista descalificadora es obviamente de esta forma).
Prueba
fuente
Java 10, 94 bytes
Puerto de @tsh 'respuesta de JavaScript .
Pruébalo en línea.
Explicación:
fuente
|=
. Supongo&=
que también funcionaría?|=
y&=
funcionan como accesos directos parab = b | condition
yb = b & condition
(donde los&
y|
son accesos directos para&&
y||
en la mayoría de los casos, por supuesto).Ruby ,
46 4038 bytesPruébalo en línea!
Esto funciona al tomar recursivamente el primer elemento
a
como pivote y verificar si el resto de la matriz se puede dividir en dos (usando intersección y unión: primero elimine todos los elementos> a, luego agréguelos nuevamente a la derecha y verifique si algo tiene cambiado)fuente
Retina 0.8.2 , 31 bytes
Pruébalo en línea! El enlace incluye casos de prueba. Utiliza el algoritmo de @ tsh. Explicación:
Convierte a unario.
Encuentra números que se encuentran entre dos números descendentes consecutivos posteriores.
Verifique que el número de coincidencias sea cero.
fuente
Perl 6 , 38 bytes
Pruébalo en línea!
Explicación
fuente
Haskell , 50 bytes
Pruébalo en línea!
fuente
Scala (
6867 Bytes)Pruébalo en línea
La respuesta del puerto de @nwellnhof .
Scala (
122103bytes)Gracias a @Laikoni por las sugerencias para acortar ambas soluciones.
Pruébalo en línea
Explicación:
span
) la matriz usando la cabeza de la matriz como criterio de corte.fuente
val (s,t)
,true
puede ser1>0
y puede caers.forall(_<i(0))&
ya que esto ya debería estar aseguradospan
.%
y soltar el espacio: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)}
.. Versión 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)
.. ¿Alguna idea de cómo hacer estos más cortos?05AB1E ,
1510 bytesRespuesta de Port of @Lynn 's Jelly .
-5 bytes gracias a @Emigna .
Pruébalo en línea o verifique todos los casos de prueba .
Explicación: "
fuente
ŒεD{3.IÊ}P
?Haskell , 41 bytes
Pruébalo en línea!
Utiliza la observación de Lynn de que es suficiente comprobar que no hay subsecuencia de la media ... alta ... baja . Esto significa que para cada elemento
h
, la lista de elementost
que viene después es un bloque de elementos<h
seguido de un bloque de elementos>h
(ambos bloques pueden estar vacíos). Entonces, el código verifica que después de soltar el prefijo de elementos<h
ent
, los elementos restantes son todos>h
. La repetición verifica esto para cada elemento inicialh
hasta que la lista tenga la longitud 1.Una posible simplificación es que es suficiente verificar si hay subpatrones en medio ... alto, bajo donde los dos últimos son consecutivos. Desafortunadamente, Haskell no tiene una forma corta de extraer los dos últimos elementos, como se puede hacer desde el frente con una coincidencia de patrones
a:b:c
. Encontré una solución más corta que busca media, alta ... baja , pero no puede rechazar entradas como[3,1,4,2]
.Casos de prueba formateados tomados de Laikoni .
fuente
Japt , 14 bytes
Intérprete Japt
Salidas
false
para BST,true
sin BST.Explicación:
fuente
Scala
Todos los enfoques son implementaciones de la regla que muestra tsh.
109
101
98
78
Si debe ser una función y no solo una expresión, cada línea debe comenzar con (17 bytes)
fuente
Oracle SQL, 177 bytes
Como no hay ningún tipo booleano en Oracle SQL, la consulta devuelve 1 o 0.
Oracle SQL 12c, 210 bytes
No es posible acceder al elemento de la matriz en SQL de la misma manera que en PL / SQL, es decir, un (i), por lo tanto, la función
f
se declarówith clause
para ese propósito. De lo contrario, la solución habría sido mucho más corta.Otras limitaciones
listado de sqlplus
Verificación en línea apex.oracle.com
Actualizar
Oracle SQL, 155 bytes
fuente
C, 823 bytes (sin contar los espacios en blanco); 923 bytes (incluido el espacio en blanco)
La versión legible del programa está a continuación:
El método principal en este programa lee la lista de números que son (supuestamente) un recorrido legítimo de preorden.
La función insert_root que se llama inserta los enteros en un árbol de búsqueda binario donde los nodos anteriores contienen valores menores y los nodos siguientes contienen valores int más grandes.
La función de preordenar (raíz) atraviesa el árbol en una travesía de preorden y concatena simultáneamente cada número entero que el algoritmo encuentra en la matriz de prueba test_list .
Un bucle while final prueba si cada uno de los valores int en la lista stdin y aquellos en test_list son equivalentes en cada índice. Si hay un elemento de lista de stdin que no coincide con el elemento correspondiente en test_list en el índice respectivo, la función principal devuelve 0. De lo contrario, el método principal devuelve 1 .
Para determinar qué main regresó, escriba echo $ status en el terminal bash. BASH imprimirá un 1 o un 0.
fuente