Dada uma lista exclusiva e ordenada de números inteiros, crie uma árvore de pesquisa binária equilibrada representada como uma matriz sem usar recursão.
Por exemplo:
func( [1,2,3,5,8,13,21] ) => [5,2,13,1,3,8,21]
Antes de começarmos, uma dica: podemos simplificar muito esse problema para que não tenhamos que pensar nos números inteiros de entrada (ou em qualquer objeto comparável a esse respeito!).
Se sabemos que a lista de entrada já está classificada, seu conteúdo é irrelevante. Podemos simplesmente pensar sobre isso em termos de índices na matriz original.
Uma representação interna da matriz de entrada se torna:
func( [0,1,2,3,4,5,6] ) => [3,1,5,0,2,4,6]
Isso significa que, em vez de escrever algo que tenha que lidar com objetos comparáveis, precisamos realmente apenas escrever uma função que mapeie do intervalo [0, n) à matriz resultante. Depois de termos a nova ordem, podemos simplesmente aplicar o mapeamento aos valores na entrada para criar a matriz de retorno.
As soluções válidas devem:
- Aceite uma matriz de elemento zero e retorne uma matriz vazia.
- Aceite uma matriz inteira de comprimento n e retorne uma matriz inteira
- De comprimento entre n e a próxima potência mais alta de 2 menos 1. (por exemplo, para o tamanho de entrada 13, retorne entre 13 e 15).
- Matriz que representa um BST em que o nó raiz está na posição 0 e a altura é igual a log (n) em que 0 representa um nó ausente (ou um
null
valor semelhante, se o seu idioma permitir). Nós vazios, se presentes, devem existir apenas no final da árvore (por exemplo,[2,1,0]
)
A matriz inteira de entrada possui as seguintes garantias:
- Os valores são números inteiros assinados de 32 bits maiores que zero.
- Os valores são únicos.
- Os valores estão em ordem crescente a partir da posição zero.
- Os valores podem ser escassos (ou seja, não adjacentes um ao outro).
O código mais conciso pela contagem de caracteres ascii vence, mas também estou interessado em ver soluções elegantes para qualquer idioma em particular.
Casos de teste
As saídas para matrizes simples que contêm 1
to n
para vários n
. Como descrito acima, os valores finais 0
são opcionais.
[]
[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]