Notre objectif est de fabriquer (gรฉnรฉrer) toutes les formes d'arbres binaires. Il y en a une infinitรฉ... Il faut limiter notre รฉtude. On peut filtrer par taille, ce qui permet de faire une classification.
๐ On considรจre ici des arbres non รฉtiquetรฉs.
Il y a donc un nombre fini d'arbres binaires non รฉtiquetรฉs de taille donnรฉe.
Modรฉlisation () | (โ , โ )
Dans cet exercice, on modรฉlisera les arbres binaires non รฉtiquetรฉs avec des tuples, de la faรงon suivante :
l'arbre binaire vide sera modรฉlisรฉ par (), le tuple vide, de taille 0 et de hauteur 0.
un arbre binaire non vide sera modรฉlisรฉ par (gauche, droite), un tuple ร deux รฉlรฉments reprรฉsentant respectivement le sous-arbre ร gauche et celui ร droite avec des tuples.
Pas de classe Noeud dans cet exercice !
Classement par taille
Il y a un seul arbre binaire de taille 0 : ()
Il y a un seul arbre binaire de taille 1 : ((), ())
Il y a deux arbres binaires de taille 2 :
((), ((), ()))
(((), ()), ())
Il y a cinq arbres binaires de taille 3 :
((), ((), ((), ())))
((), (((), ()), ()))
(((), ()), ((), ()))
(((), ((), ())), ())
((((), ()), ()), ())
Arbres binaires de taille 4
Les 14 arbres binaires de taille 4, peuvent รชtre rรฉpartis en fonction de la taille des sous arbres.
Il y a un nลud racine et 3 autres nลuds ร rรฉpartir ร gauche () et ร droite ().
ร รฉร รฉ
Exercice
On considรจre le dictionnairedico_ab qui, ร une taille donnรฉe, associe la liste des squelettes des arbres binaires de cette taille.
On peut initialiser ce dictionnaire avec {0: [()]} : pour la taille 0, la liste des squelettes n'a qu'un seul รฉlรฉment, le squelette vide ().
Complรฉter le script avec la fonction gรฉnรจre_ab qui prend n un entier et qui modifie le dictionnaire dico_ab avec
toutes les clรฉs entiers naturels k infรฉrieurs ou รฉgaux ร n
et dont la valeur associรฉe est la liste (peu importe l'ordre) des squelettes d'arbres binaires de taille n modรฉlisรฉs avec () | (โ , โ ).
Aide
Si , c'est facile ร crรฉer, avec dico_ab[0], par exemple.
Sinon, on fait une boucle pour k allant de 1 ร n inclus, et on peut utiliser les listes des arbres binaires dรฉjร construits.
On construit (si ce n'รฉtait pas dรฉjร fait) tous les arbres binaires possibles avec une taille , composรฉs donc d'une racine et de deux sous-arbres binaires dont les tailles et vรฉrifient .
On recommande de crรฉer une fonction auxiliaire pour un code plus propre.
Guide
๐ Script Python
defconstruit(k):"Renvoie la liste des squelettes de taille k"ifk==0:return...liste_k=[]fort_ginrange(k):t_d=...forgaucheindico_ab[...]:fordroiteindico_ab[...]:skel=...liste_k.append(skel)returnliste_kdefgรฉnรจre_ab(n):"Complรจte, si besoin, le dictionnaire dico_ab pour toute clรฉ de 0 ร n"forkinrange(n+1):ifk...:dico_ab[k]=construit(k)
1
0
1
2
3
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
dico_ab=dict()
defgรฉnรจre_ab(N):
"Complรจte, si besoin, le dictionnaire dico_ab pour toute clรฉ de 0 ร N"
# Tests
(insensible ร la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)