Étant donné une liste unique et triée d'entiers, créez un arbre de recherche binaire équilibré représenté sous forme de tableau sans utiliser de récursivité.
Par exemple:
func( [1,2,3,5,8,13,21] ) => [5,2,13,1,3,8,21]
Avant de commencer, un indice: nous pouvons simplifier ce problème d'une tonne pour ne pas avoir à penser aux entiers d'entrée (ou à tout objet comparable d'ailleurs!).
Si nous savons que la liste d'entrée est déjà triée, son contenu n'a pas d'importance. Nous pouvons simplement y penser en termes d'indices dans le tableau d'origine.
Une représentation interne du tableau d'entrée devient alors:
func( [0,1,2,3,4,5,6] ) => [3,1,5,0,2,4,6]
Cela signifie que plutôt que d'écrire quelque chose qui doit traiter avec des objets comparables, nous n'avons vraiment besoin que d'écrire une fonction qui mappe de la plage [0, n) au tableau résultant. Une fois que nous avons la nouvelle commande, nous pouvons simplement appliquer le mappage aux valeurs de l'entrée pour créer le tableau de retour.
Les solutions valides doivent:
- Acceptez un tableau à zéro élément et renvoyez un tableau vide.
- Acceptez un tableau entier de longueur n et retournez un tableau entier
- D'une longueur comprise entre n et la puissance immédiatement supérieure de 2 moins 1. (par exemple, pour la taille d'entrée 13, retournez entre 13 et 15).
- Tableau qui représente un BST où le nœud racine est à la position 0 et la hauteur est égale à log (n) où 0 représente un nœud manquant (ou une
null
valeur semblable à si votre langue le permet). Les nœuds vides, s'ils sont présents, ne doivent exister qu'à la fin de l'arborescence (par exemple,[2,1,0]
)
Le tableau d'entiers en entrée présente les garanties suivantes:
- Les valeurs sont des entiers signés 32 bits supérieurs à zéro.
- Les valeurs sont uniques.
- Les valeurs sont en ordre croissant à partir de la position zéro.
- Les valeurs peuvent être clairsemées (c'est-à-dire non adjacentes les unes aux autres).
Le code le plus laconique par nombre de caractères ascii gagne, mais je suis également intéressé à voir des solutions élégantes pour une langue particulière.
Cas de test
Les sorties pour les tableaux simples contenant 1
to n
pour divers n
. Comme décrit ci-dessus, les 0
s finaux sont facultatifs.
[]
[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]