Diberikan daftar unik, diurutkan dari bilangan bulat, buat pohon pencarian biner seimbang yang diwakili sebagai array tanpa menggunakan rekursi.
Sebagai contoh:
func( [1,2,3,5,8,13,21] ) => [5,2,13,1,3,8,21]
Sebelum kita mulai, sebuah petunjuk: kita dapat menyederhanakan masalah ini satu ton sehingga kita tidak benar-benar harus memikirkan bilangan bulat input (atau objek yang sebanding dalam hal ini!).
Jika kita tahu daftar input sudah disortir, isinya tidak relevan. Kita bisa memikirkannya dalam hal indeks ke dalam array asli.
Representasi internal dari array input kemudian menjadi:
func( [0,1,2,3,4,5,6] ) => [3,1,5,0,2,4,6]
Ini berarti daripada menulis sesuatu yang harus berurusan dengan objek yang sebanding, kita benar-benar hanya perlu menulis fungsi yang memetakan dari rentang [0, n) ke array yang dihasilkan. Setelah kami memiliki orde baru, kami cukup menerapkan pemetaan kembali ke nilai-nilai dalam input untuk membuat array kembali.
Solusi yang valid harus:
- Terima array elemen-nol dan kembalikan array kosong.
- Terima array integer dengan panjang n dan kembalikan array integer
- Panjang antara n dan daya tertinggi berikutnya 2 minus 1. (misalnya, untuk ukuran input 13 kembali di mana saja antara 13 dan 15).
- Array yang mewakili BST di mana simpul akar berada di posisi 0 dan tingginya sama dengan log (n) di mana 0 mewakili simpul yang hilang (atau
null
nilai -seperti jika bahasa Anda memungkinkan). Node kosong, jika ada, harus hanya ada di ujung pohon (misalnya,[2,1,0]
)
Array integer input memiliki jaminan berikut:
- Nilai adalah bilangan bulat bertanda 32-bit yang lebih besar dari nol.
- Nilai unik.
- Nilai berada dalam urutan menaik dari posisi nol.
- Nilai mungkin jarang (yaitu, tidak berdekatan satu sama lain).
Kode paling singkat menurut jumlah karakter ascii menang, tapi saya juga tertarik melihat solusi elegan untuk bahasa tertentu.
Uji kasus
Output untuk array sederhana yang berisi 1
untuk n
untuk berbagai n
. Seperti dijelaskan di atas, trailing 0
s adalah opsional.
[]
[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]