Hintergrund
Ein binärer Baum ist ein Stammbaum, dessen Knoten höchstens zwei untergeordnete Knoten haben.
Ein beschrifteter Binärbaum ist ein Binärbaum, dessen jeder Knoten mit einer positiven ganzen Zahl beschriftet ist. Außerdem sind alle Bezeichnungen unterschiedlich .
Ein BST (Binary Search Tree) ist ein beschrifteter Binärbaum, bei dem die Bezeichnung jedes Knotens größer ist als die Bezeichnung aller Knoten in seinem linken Teilbaum und kleiner als die Bezeichnung aller Knoten in seinem rechten Teilbaum. Das Folgende ist zum Beispiel eine BST:
Das Durchlaufen eines markierten Binärbaums vor der Bestellung wird durch den folgenden Pseudocode definiert.
function preorder(node)
if node is null then
return
else
print(node.label)
preorder(node.left)
preorder(node.right)
Sehen Sie sich das folgende Bild an, um eine bessere Intuition zu erhalten:
Die Eckpunkte dieses Binärbaums werden in der folgenden Reihenfolge gedruckt:
F, B, A, D, C, E, G, I, H
Sie können mehr über BSTs lesen hier , und mehr über Pre-Order Traversal hier .
Herausforderung
Wenn Sie eine Liste von ganzen Zahlen , müssen Sie feststellen, ob es eine BST gibt, deren Traversal vorbestellt genau ausgibt .
Eingang
- Eine nicht leere Liste eindeutiger positiver Ganzzahlen .
- Optional kann die Länge von .
Ausgabe
- Ein wahrer Wert, wenn das Durchlaufen einer BST vorbestellt.
- Ein falscher Wert sonst.
Regeln
- Es gelten die Standardregeln für gültige Einreichungen , E / A und Lücken .
- Das ist Code-Golf , also gewinnt die kürzeste Lösung (in Bytes). Lassen Sie sich wie üblich nicht von lächerlich kurzen Lösungen in Golfsprachen davon abhalten, eine längere Antwort in der Sprache Ihrer Wahl zu verfassen.
- Dies ist keine Regel, aber Ihre Antwort wird besser angenommen, wenn sie einen Link zum Testen der Lösung und eine Erklärung zur Funktionsweise enthält.
Beispiele
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
Schauen Sie sich diesen Link an (mit freundlicher Genehmigung von Kevin Cruijssen ), um sich die Beispiele anzusehen.
quelle
Antworten:
JavaScript (Node.js) , 49 Byte
Probieren Sie es online!
Sparen Sie dank Arnauld 1 Byte.
quelle
Gelee , 7 Bytes
Probieren Sie es online!
Rückgabe
[4]
für Traversen, ansonsten[]
.Im Wesentlichen tsh-Algorithmus verwendet: die „disqualifiziert“ Bedingung für eine Pre-Order Traversal ist eine Teilfolge von 3 Elementen , die aussehen wie [mittel, hoch, niedrig] . (Zum Beispiel [20, 30, 10].)
Wir überprüfen äquivalent alle Untersequenzen beliebiger Länge, die den Index 4 in ihren Permutationslisten haben. Dabei handelt es sich um Listen, die wie folgt sortiert sind: [a 1 … a k cdb], wobei das a i sortiert ist und a i <b <c <d . (Jede solche Liste ist disqualifizierend, wenn wir uns die letzten drei Elemente ansehen, und jede Disqualifizierungsliste hat offensichtlich diese Form.)
Beweis
quelle
Java 10, 94 Bytes
Hafen von @tsh 'JavaScript-Antwort .
Probieren Sie es online aus.
Erläuterung:
quelle
|=
. Ich nehme an,&=
würde auch funktionieren?|=
und&=
arbeiten als Verknüpfungen fürb = b | condition
undb = b & condition
(wobei die&
und|
Verknüpfungen für&&
und||
in den meisten Fällen natürlich sind).Ruby ,
46 4038 BytesProbieren Sie es online!
Dies funktioniert, indem rekursiv das erste Element
a
als Pivot genommen und geprüft wird, ob der Rest des Arrays in zwei Teile geteilt werden kann (mit Hilfe von Schnitt und Vereinigung: Entfernen Sie zuerst alle Elemente> a, fügen Sie sie dann rechts erneut hinzu und prüfen Sie, ob etwas vorhanden ist geändert).quelle
Retina 0.8.2 , 31 Bytes
Probieren Sie es online! Link enthält Testfälle. Verwendet den @ tsh-Algorithmus. Erläuterung:
In Unary konvertieren.
Suchen Sie nach Zahlen, die zwischen zwei aufeinanderfolgenden absteigenden Zahlen liegen.
Stellen Sie sicher, dass die Anzahl der Übereinstimmungen Null ist.
quelle
Perl 6 , 38 Bytes
Probieren Sie es online!
Erläuterung
quelle
Haskell , 50 Bytes
Probieren Sie es online!
quelle
Scala (
6867 Bytes)Probieren Sie es online aus
Port of @ nwellnhofs Antwort .
Scala (
122103 Bytes)Vielen Dank an @Laikoni für die Vorschläge, beide Lösungen zu verkürzen.
Probieren Sie es online aus
Erläuterung:
span
Schneiden Sie (unter Verwendung von Scala ) das Array unter Verwendung des Array-Kopfes als Aufteilungskriterium.quelle
val (s,t)
,true
kannst drin sein1>0
und kannst fallen,s.forall(_<i(0))&
da dieser schon durch versichert sein solltespan
.%
und das Leerzeichendef%(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)}
. Version 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)
. Irgendwelche Ideen, wie man diese kürzer macht?05AB1E ,
1510 BytesPort of @Lynn 's Jelly Antwort .
-5 Bytes dank @Emigna .
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung: "
quelle
ŒεD{3.IÊ}P
?Haskell , 41 Bytes
Probieren Sie es online!
Verwendet Lynns Beobachtung, dass es ausreicht, um zu überprüfen, ob es keine Untersequenz von for mid..high..low gibt . Dies bedeutet, dass für jedes Element
h
die Liste der nachfolgendent
Elemente ein Block von Elementen<h
gefolgt von einem Block von Elementen ist>h
(beide Blöcke können leer sein). Also, der Code überprüft , dass , nachdem wir das Präfix der Elemente fallen<h
int
, sind die übrigen Elemente alle>h
. Recursing überprüft dies für jedes Anfangselement,h
bis die Liste die Länge 1 hat.Eine mögliche Vereinfachung besteht darin, dass es ausreicht, nach Untermustern zu suchen hoch und niedrig zu suchen, wenn die letzten beiden aufeinander folgen . Leider hat Haskell keine kurze Möglichkeit, die letzten beiden Elemente zu extrahieren, wie dies von vorne mit einer Musterübereinstimmung möglich ist
a:b:c
. Ich habe eine kürzere Lösung gefunden, die nach mittleren, hohen und niedrigen Werten sucht , aber Eingaben wie diese werden nicht zurückgewiesen[3,1,4,2]
.Formatierte Testfälle aus Laikoni .
quelle
Japt , 14 Bytes
Japt Interpreter
Ausgänge
false
für BST,true
für kein BST.Erläuterung:
quelle
Scala
Alle Ansätze sind Implementierungen der von tsh gezeigten Regel.
109
101
98
78
Wenn es sich um eine Funktion und nicht nur um einen Ausdruck handeln muss, muss jede Zeile mit (17 Byte) beginnen.
quelle
Oracle SQL, 177 Byte
Da es in Oracle SQL keinen Booleschen Typ gibt, gibt query entweder 1 oder 0 zurück.
Oracle SQL 12c, 210 Byte
Es ist in SQL nicht möglich, auf das Element des Arrays wie in PL / SQL zuzugreifen - dh a (i), daher wurde die Funktion
f
zuwith clause
diesem Zweck deklariert . Andernfalls wäre die Lösung viel kürzer gewesen.Andere Einschränkungen
sqlplus Listing
Online-Überprüfung apex.oracle.com
Aktualisieren
Oracle SQL, 155 Byte
quelle
C, 823 Bytes (ohne Leerzeichen); 923 Bytes (einschließlich Leerzeichen)
Die lesbare Version des Programms ist unten:
Die Hauptmethode in diesem Programm liest die Liste der Nummern, die (angeblich) eine legitime Vorbestellungsüberquerung darstellen.
Die aufgerufene Funktion insert_root fügt die Ganzzahlen in einen binären Suchbaum ein, in dem vorherige Knoten kleinere Werte und nächste Knoten größere int-Werte enthalten.
Die Funktion preorder (root) durchläuft den Baum in einem Preorder-Traversal und verkettet gleichzeitig jede Ganzzahl, auf die der Algorithmus stößt, mit dem Int-Array test_list .
Eine abschließende while-Schleife prüft, ob jeder der int-Werte in der stdin- Liste und die in test_list bei jedem Index gleich sind. Wenn es ein Listenelement von stdin gibt , das nicht mit dem entsprechenden Element in test_list am jeweiligen Index übereinstimmt, gibt die Hauptfunktion 0 zurück . Andernfalls gibt die Hauptmethode 1 zurück .
Geben Sie echo $ status in das Bash-Terminal ein, um festzustellen, welche Hauptdaten zurückgegeben wurden . BASH gibt entweder eine 1 oder eine 0 aus.
quelle