Erstellen Sie anhand einer eindeutigen, sortierten Liste von Ganzzahlen einen ausgeglichenen Binärsuchbaum, der als Array ohne Verwendung von Rekursion dargestellt wird.
Beispielsweise:
func( [1,2,3,5,8,13,21] ) => [5,2,13,1,3,8,21]
Bevor wir anfangen, ein Hinweis: Wir können dieses Problem um ein Vielfaches vereinfachen, damit wir nicht über die Eingabe-Ganzzahlen (oder ein vergleichbares Objekt) nachdenken müssen.
Wenn wir wissen, dass die Eingabeliste bereits sortiert ist, ist der Inhalt irrelevant. Wir können es uns einfach in Form von Indizes in das ursprüngliche Array überlegen.
Eine interne Darstellung des Eingabearrays wird dann:
func( [0,1,2,3,4,5,6] ) => [3,1,5,0,2,4,6]
Das heißt, anstatt etwas zu schreiben, das mit vergleichbaren Objekten zu tun hat, müssen wir wirklich nur eine Funktion schreiben, die aus dem Bereich [0, n) auf das resultierende Array abgebildet wird. Sobald wir die neue Reihenfolge haben, können wir die Zuordnung einfach wieder auf die Werte in der Eingabe anwenden, um das Rückgabearray zu erstellen.
Gültige Lösungen müssen:
- Akzeptieren Sie ein Array mit null Elementen und geben Sie ein leeres Array zurück.
- Akzeptieren Sie ein Integer-Array der Länge n und geben Sie ein Integer-Array zurück
- Mit einer Länge zwischen n und der nächsthöheren Potenz von 2 minus 1. (z. B. bei Eingangsgröße 13 irgendwo zwischen 13 und 15 zurückgeben).
- Array, das eine BST darstellt, bei der sich der Stammknoten an Position 0 befindet und die Höhe log (n) entspricht, wobei 0 einen fehlenden Knoten darstellt (oder einen
null
ähnlichen Wert, wenn Ihre Sprache dies zulässt). Leere Knoten, falls vorhanden, dürfen nur am Ende des Baumes existieren (zB[2,1,0]
)
Das ganzzahlige Eingabearray hat die folgenden Garantien:
- Werte sind 32-Bit-Ganzzahlen mit Vorzeichen, die größer als Null sind.
- Werte sind einzigartig.
- Die Werte sind ab Position Null aufsteigend sortiert.
- Werte können spärlich sein (dh nicht nebeneinander liegen).
Der knappste Code nach Anzahl der ASCII-Zeichen gewinnt, aber ich bin auch daran interessiert, elegante Lösungen für eine bestimmte Sprache zu finden.
Testfälle
Die Ausgaben für einfache Arrays enthalten 1
bis n
für verschiedene n
. Wie oben beschrieben, sind die nachfolgenden 0
s optional.
[]
[1]
[2,1,0]
[2,1,3]
[3,2,4,1,0,0,0]
[4,2,5,1,3,0,0]
[4,2,6,1,3,5,0]
[4,2,6,1,3,5,7]
[5,3,7,2,4,6,8,1,0,0,0,0,0,0,0]
[6,4,8,2,5,7,9,1,3,0,0,0,0,0,0]
[7,4,9,2,6,8,10,1,3,5,0,0,0,0,0]
[8,4,10,2,6,9,11,1,3,5,7,0,0,0,0]
[8,4,11,2,6,10,12,1,3,5,7,9,0,0,0]
[8,4,12,2,6,10,13,1,3,5,7,9,11,0,0]
[8,4,12,2,6,10,14,1,3,5,7,9,11,13,0]
[8,4,12,2,6,10,14,1,3,5,7,9,11,13,15]