Biorąc pod uwagę unikalną, posortowaną listę liczb całkowitych, utwórz zrównoważone drzewo wyszukiwania binarnego reprezentowane jako tablica bez użycia rekurencji.
Na przykład:
func( [1,2,3,5,8,13,21] ) => [5,2,13,1,3,8,21]
Zanim zaczniemy, wskazówka: możemy uprościć ten problem tonę, abyśmy nie musieli myśleć o wejściowych liczbach całkowitych (ani o żadnym podobnym obiekcie!).
Jeśli wiemy, że lista wejściowa jest już posortowana, jej zawartość nie ma znaczenia. Możemy po prostu pomyśleć o tym w kategoriach wskaźników w oryginalnej tablicy.
Wewnętrzna reprezentacja tablicy wejściowej staje się następnie:
func( [0,1,2,3,4,5,6] ) => [3,1,5,0,2,4,6]
Oznacza to, że zamiast pisać coś, co ma do czynienia z porównywalnymi obiektami, naprawdę wystarczy napisać funkcję, która odwzorowuje zakres z zakresu [0, n) na wynikową tablicę. Po otrzymaniu nowego zamówienia możemy po prostu zastosować mapowanie z powrotem do wartości na wejściu, aby utworzyć tablicę zwrotną.
Prawidłowe rozwiązania muszą:
- Zaakceptuj tablicę z zerowymi elementami i zwróć pustą tablicę.
- Zaakceptuj tablicę liczb całkowitych o długości n i zwróć tablicę liczb całkowitych
- O długości od n do następnej największej potęgi 2 minus 1. (np. Dla wielkości wejściowej 13 powróć gdziekolwiek między 13 a 15).
- Tablica reprezentująca BST, w której węzeł główny znajduje się w pozycji 0, a wysokość jest równa log (n), gdzie 0 oznacza brakujący węzeł (lub
null
podobną wartość, jeśli pozwala na to Twój język). Puste węzły, jeśli są obecne, muszą istnieć tylko na końcu drzewa (np.[2,1,0]
)
Wejściowa tablica liczb całkowitych ma następujące gwarancje:
- Wartości to 32-bitowe liczby całkowite ze znakiem większe od zera.
- Wartości są unikalne.
- Wartości są w porządku rosnącym od pozycji zero.
- Wartości mogą być rzadkie (tj. Nie przylegać do siebie).
Wygrywa najbardziej zwięzły kod według liczby znaków ascii, ale interesują mnie również eleganckie rozwiązania dla każdego konkretnego języka.
Przypadki testowe
Wyjścia w prostych układach zawierających 1
się n
na różne n
. Jak opisano powyżej, końcowe 0
s są opcjonalne.
[]
[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]