Création d'arbre aléatoire de taille donnée
Grande utilité
Il y a de nombreuses situations où on souhaite tester un algorithme sur un grand arbre binaire.
Il est très utile de pouvoir en fabriquer un de manière aléatoire !
Exercice
Coder une fonction aléa_taille qui prend en paramètre t un entier positif et qui renvoie un arbre binaire aléatoire de taille t.
Dans cet exercice, pour chaque nœud :
- La répartition des étiquettes doit être uniforme dans l'intervalle des entiers de
[0..256[;- prendre donc un entier au hasard dans
[0..256[.
- prendre donc un entier au hasard dans
- La répartition des nœuds dans les sous-arbres à droite et à gauche doit être uniforme ;
- choisir un nombre au hasard pour le partage en deux de ce qui reste après la racine : entre rien et tout à gauche, et le contraire.
Par exemple, pour un arbre de taille 10,
- Il y a 1 nœud racine et 9 nœuds à répartir dans les sous-arbres.
- Le sous-arbre à gauche doit avoir une chance sur 10 d'avoir une taille pour chacun des cas de 0 inclus à 9 inclus.
- De même pour le sous-arbre à droite.
- ... De même pour chaque nœud des sous-arbres, de manière récursive.
Un arbre binaire de taille 4
graph TB
N0("11")
N0 --> N1("42")
N0 --> N2("11")
N1 --> N11(" ")
N1 --> N12("21")
N12 --> N121(" ")
N12 --> N122(" ")
N2 --> N21(" ")
N2 --> N22(" ")
randrange du module random
Un exemple d'un tirage d'un des 10 chiffres : de 0 à 9 inclus.
>>> from random import randrange
>>> randrange(10)
9
randrangefonctionne commerangeavec 1, 2 ou 3 paramètres. C'est un excellent choix.- On trouve
randintsouvent utilisé, mais dans ce cours on recommanderandrange. D'ailleurs, dans Pythonrandintfait appel àrandrange...
Fonction taille disponible
La fonction taille (déjà vue) est ici directement disponible. Elle vous permettra de vérifier que votre construction est bonne.
Rappel : La fonction taille prend en paramètre un arbre binaire défini à l'aide de la classe Noeud et renvoie la taille de l'arbre : son nombre de nœuds.
# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)