Dato un elenco unico e ordinato di numeri interi, creare un albero di ricerca binaria bilanciato rappresentato come un array senza ricorrere alla ricorsione.
Per esempio:
func( [1,2,3,5,8,13,21] ) => [5,2,13,1,3,8,21]
Prima di iniziare, un suggerimento: possiamo semplificare un po 'questo problema in modo da non dover effettivamente pensare agli interi di input (o ad altri oggetti comparabili per quella materia!).
Se sappiamo che l'elenco di input è già ordinato, i suoi contenuti sono irrilevanti. Possiamo semplicemente pensarci in termini di indici nella matrice originale.
Una rappresentazione interna dell'array di input diventa quindi:
func( [0,1,2,3,4,5,6] ) => [3,1,5,0,2,4,6]
Ciò significa piuttosto che scrivere qualcosa che ha a che fare con oggetti comparabili, in realtà abbiamo solo bisogno di scrivere una funzione che mappa dall'intervallo [0, n) all'array risultante. Una volta che abbiamo il nuovo ordine, possiamo semplicemente applicare la mappatura ai valori nell'input per creare l'array di ritorno.
Le soluzioni valide devono:
- Accettare un array a zero elementi e restituire un array vuoto.
- Accetta una matrice intera di lunghezza n e restituisce una matrice intera
- Di lunghezza compresa tra n e la successiva potenza massima di 2 meno 1. (ad es., Per le dimensioni di input 13, tornare tra 13 e 15).
- Matrice che rappresenta un BST in cui il nodo principale è nella posizione 0 e l'altezza è uguale al registro (n) dove 0 rappresenta un nodo mancante (o un
null
valore simile se la tua lingua lo consente). I nodi vuoti, se presenti, devono esistere solo alla fine dell'albero (ad es.[2,1,0]
)
L'array intero di input ha le seguenti garanzie:
- I valori sono numeri interi con segno a 32 bit maggiori di zero.
- I valori sono unici.
- I valori sono in ordine crescente dalla posizione zero.
- I valori possono essere sparsi (cioè non adiacenti l'uno all'altro).
Vince il codice più conciso per numero di caratteri ASCII, ma sono anche interessato a vedere soluzioni eleganti per qualsiasi lingua particolare.
Casi test
Le uscite per array semplici contenenti 1
a n
per vari n
. Come descritto sopra, i messaggi finali 0
sono opzionali.
[]
[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]