Les arbres binaires
Programme
Notions | Compétences | Remarques |
---|---|---|
Arbres : structures hiĂ©rarchiques. Arbres binaires : nĆuds, racines, feuilles, sous-arbres gauches, sous-arbres droits. |
Identifier des situations nĂ©cessitant une structure de donnĂ©es arborescente. Ăvaluer quelques mesures des arbres binaires (taille, encadrement de la hauteur, etc.). |
On fait le lien avec la rubrique « algorithmique ». |
Activité 1 - Introduction
Regardez la vidéo
- Construisez un ou deux terriers correspondants Ă la consigne : un terrier qui minimise le nombre de trajets.
N'oubliez pas d'indiquer pour chaque arbre le nombre total de trajets fait pour toutes les marmottes du terrier. Pour chaque marmotte on prend le nombre de fois oĂč elle se rĂ©veille fois le nombre de tunnels empruntĂ©s. - Comparez avec les autres Ă©lĂšves de la classe les diffĂ©rents terriers crĂ©Ă©s. CaractĂ©risez les arbres qui rĂ©pondent le mieux Ă la question.
- DĂ©terminez un algorithme de construction de terrier qui minimise le nombre de trajets.
Correction
flowchart TD A(( )) --- B(( )) A --- C(( )) B --- D(( )) B --- E((5)) C --- F((7)) C --- G((8)) D --- H((2)) D --- I((3))
- Nombre de trajets: 2 x 6 + 3 x 6 + 5 x 4 + 7 x 4 + 8 x 4 = 110
-
Par exemple, si on a les réveils des marmottes suivants : 7; 3; 5; 9; 2; 4; 6
- on crĂ©Ă© des terriers en les sĂ©parant en deux au bout de chacun, jusquâĂ ce quâil y ait autant de terrier que de marmottes (ici 7)
flowchart TD A(( )) --- B(( )) A --- C(( )) B --- D(( )) B --- E(( )) C --- F(( )) C --- G((9)) D --- H((2)) D --- I((3)) E --- K((4)) E --- L((5)) F --- M((6)) F --- N((7))
- On place les marmottes le plus en haut suivant le nombre de rĂ©veil le plus haut, puis on descend au niveau infĂ©rieur et on recommenceâŠ
Ici, le nombre de trajet est : 2 x 6 + 3 x 6 + 4 x 6 + 5 x 6 + 6 x 6 + 7 x 6 + 9 x 4 = 198
Les arbres binaires
Vidéo
Un arbre binaire est une structure dite arborescente oĂč chaque position donne accĂšs sur exactement deux branches.
Un arbre binaire est un ensemble fini de noeuds correspondant Ă l'un des deux cas suivants :
- soit l'arbre est vide, c'est Ă dire qu'il ne contient aucun noeud.
- soit l'arbre n'est pas vide et ses noeuds sont structurés de la maniÚre suivante :
- un noeud est appelé la racine de l'arbre.
- la racine a deux branches (ou arĂȘtes) qui forment rĂ©cursivement deux sous-arbres (ou fils) appelĂ©s respectivement sous-arbre gauche et sous-arbre droit.
Un noeud dont les sous-arbres sont vides est appelé feuille.
Dans la figure ci-dessous, tous les arbres dessinĂ©s sont deux Ă deux distincts, ce qui confirme qu'il faut distinguer sous-arbre droit et gauche, et qu'un des sous-arbres peut ĂȘtre vide :
Activité 2 - Nombre de noeuds
- Dessiner tous les arbres binaires ayant 3 noeuds.
- Dessiner tous les arbres binaires ayant 4 noeuds.
Correction
Avec 3 noeuds :
flowchart LR
subgraph a [A]
direction TB
A(( )) --- B(( ))
A --- C(( ))
end
subgraph b [B]
direction TB
D(( )) --- E(( ))
D --- F(( ))
E --- G(( ))
E --- H(( ))
style F opacity:0
linkStyle 3 stroke-width:0px
style H opacity:0
linkStyle 5 stroke-width:0px
end
subgraph c [C]
direction TB
I(( )) --- J(( ))
I --- K(( ))
K --- M(( ))
K --- L(( ))
style J opacity:0
linkStyle 6 stroke-width:0px
style M opacity:0
linkStyle 8 stroke-width:0px
end
subgraph d [D]
direction TB
N(( )) --- O(( ))
N --- P(( ))
O --- Q(( ))
O --- R(( ))
style P opacity:0
linkStyle 11 stroke-width:0px
style Q opacity:0
linkStyle 12 stroke-width:0px
end
subgraph e [E]
direction TB
S(( )) --- T(( ))
S --- U(( ))
U --- V(( ))
U --- W(( ))
style T opacity:0
linkStyle 14 stroke-width:0px
style W opacity:0
linkStyle 17 stroke-width:0px
end
a x--x | | b x--x | | c x--x | | d x--x | | e
Avec 4 noeuds :
flowchart LR
subgraph a [A]
direction TB
A(( )) --- B(( ))
A --- C(( ))
B --- D(( ))
B --- E(( ))
D --- F(( ))
D --- G(( ))
style C opacity:0
linkStyle 1 stroke-width:0px
style E opacity:0
linkStyle 3 stroke-width:0px
style G opacity:0
linkStyle 5 stroke-width:0px
end
subgraph b [B]
direction TB
A1(( )) --- B1(( ))
A1 --- C1(( ))
C1 --- D1(( ))
C1 --- E1(( ))
E1 --- F1(( ))
E1 --- G1(( ))
style B1 opacity:0
linkStyle 6 stroke-width:0px
style D1 opacity:0
linkStyle 8 stroke-width:0px
style F1 opacity:0
linkStyle 10 stroke-width:0px
end
subgraph c [C]
direction TB
A2(( )) --- B2(( ))
A2 --- C2(( ))
B2 --- D2(( ))
B2 --- E2(( ))
E2 --- F2(( ))
E2 --- G2(( ))
style C2 opacity:0
linkStyle 13 stroke-width:0px
style D2 opacity:0
linkStyle 14 stroke-width:0px
style G2 opacity:0
linkStyle 17 stroke-width:0px
end
subgraph d [D]
direction TB
A3(( )) --- B3(( ))
A3 --- C3(( ))
C3 --- D3(( ))
C3 --- E3(( ))
D3 --- F3(( ))
D3 --- G3(( ))
style B3 opacity:0
linkStyle 18 stroke-width:0px
style E3 opacity:0
linkStyle 21 stroke-width:0px
style F3 opacity:0
linkStyle 22 stroke-width:0px
end
subgraph e [E]
direction TB
A4(( )) --- B4(( ))
A4 --- C4(( ))
C4 --- D4(( ))
C4 --- E4(( ))
D4 --- F4(( ))
D4 --- G4(( ))
style B4 opacity:0
linkStyle 24 stroke-width:0px
style E4 opacity:0
linkStyle 27 stroke-width:0px
style G4 opacity:0
linkStyle 29 stroke-width:0px
end
subgraph f [F]
direction TB
A5(( )) --- B5(( ))
A5 --- C5(( ))
B5 --- D5(( ))
B5 --- E5(( ))
E5 --- F5(( ))
E5 --- G5(( ))
style C5 opacity:0
linkStyle 31 stroke-width:0px
style D5 opacity:0
linkStyle 32 stroke-width:0px
style F5 opacity:0
linkStyle 34 stroke-width:0px
end
a x--x | | b x--x | | c x--x | | d x--x | | e x--x | | f
flowchart LR
subgraph a [A]
direction TB
A(( )) --- B(( ))
A --- C(( ))
B --- D(( ))
B --- E(( ))
style C opacity:0
linkStyle 1 stroke-width:0px
end
subgraph b [B]
direction TB
A1(( )) --- B1(( ))
A1 --- C1(( ))
C1 --- D1(( ))
C1 --- E1(( ))
style B1 opacity:0
linkStyle 4 stroke-width:0px
end
subgraph c [C]
direction TB
A4(( )) --- B4(( ))
A4 --- C4(( ))
B4 --- F4(( ))
B4 --- G4(( ))
style F4 opacity:0
linkStyle 10 stroke-width:0px
end
subgraph d [D]
direction TB
A3(( )) --- B3(( ))
A3 --- C3(( ))
C3 --- D3(( ))
C3 --- E3(( ))
style E3 opacity:0
linkStyle 15 stroke-width:0px
end
subgraph e [E]
direction TB
A2(( )) --- B2(( ))
A2 --- C2(( ))
B2 --- D2(( ))
B2 --- E2(( ))
style E2 opacity:0
linkStyle 19 stroke-width:0px
end
subgraph f [F]
direction TB
A5(( )) --- B5(( ))
A5 --- C5(( ))
C5 --- D5(( ))
C5 --- E5(( ))
style D5 opacity:0
linkStyle 22 stroke-width:0px
end
a x--x | | b x--x | | c x--x | | d x--x | | e x--x | | f
Propriétés
Taille : nombre de noeuds d'un arbre.
Profondeur :
Hauteur : Profondeur maximale d'un arbre
Complet ou parfait : c'est un arbre binaire de hauteur h tel qu'à chaque profondeur p tous les noeuds sont présents.
Activité 3 - Taille et hauteur
Déterminer les taille et hauteur de chaque arbre de l'activité précédente.
Correction
Avec 3 noeuds :
flowchart LR
subgraph a [Hauteur 2]
direction TB
A(( )) --- B(( ))
A --- C(( ))
end
subgraph b [Hauteur 3]
direction TB
D(( )) --- E(( ))
D --- F(( ))
E --- G(( ))
E --- H(( ))
style F opacity:0
linkStyle 3 stroke-width:0px
style H opacity:0
linkStyle 5 stroke-width:0px
end
subgraph c [Hauteur 3]
direction TB
I(( )) --- J(( ))
I --- K(( ))
K --- M(( ))
K --- L(( ))
style J opacity:0
linkStyle 6 stroke-width:0px
style M opacity:0
linkStyle 8 stroke-width:0px
end
subgraph d [Hauteur 3]
direction TB
N(( )) --- O(( ))
N --- P(( ))
O --- Q(( ))
O --- R(( ))
style P opacity:0
linkStyle 11 stroke-width:0px
style Q opacity:0
linkStyle 12 stroke-width:0px
end
subgraph e [Hauteur 3]
direction TB
S(( )) --- T(( ))
S --- U(( ))
U --- V(( ))
U --- W(( ))
style T opacity:0
linkStyle 14 stroke-width:0px
style W opacity:0
linkStyle 17 stroke-width:0px
end
a x--x | | b x--x | | c x--x | | d x--x | | e
Avec 4 noeuds :
flowchart LR
subgraph a [Hauteur 4]
direction TB
A(( )) --- B(( ))
A --- C(( ))
B --- D(( ))
B --- E(( ))
D --- F(( ))
D --- G(( ))
style C opacity:0
linkStyle 1 stroke-width:0px
style E opacity:0
linkStyle 3 stroke-width:0px
style G opacity:0
linkStyle 5 stroke-width:0px
end
subgraph b [Hauteur 4]
direction TB
A1(( )) --- B1(( ))
A1 --- C1(( ))
C1 --- D1(( ))
C1 --- E1(( ))
E1 --- F1(( ))
E1 --- G1(( ))
style B1 opacity:0
linkStyle 6 stroke-width:0px
style D1 opacity:0
linkStyle 8 stroke-width:0px
style F1 opacity:0
linkStyle 10 stroke-width:0px
end
subgraph c [Hauteur 4]
direction TB
A2(( )) --- B2(( ))
A2 --- C2(( ))
B2 --- D2(( ))
B2 --- E2(( ))
E2 --- F2(( ))
E2 --- G2(( ))
style C2 opacity:0
linkStyle 13 stroke-width:0px
style D2 opacity:0
linkStyle 14 stroke-width:0px
style G2 opacity:0
linkStyle 17 stroke-width:0px
end
subgraph d [Hauteur 4]
direction TB
A3(( )) --- B3(( ))
A3 --- C3(( ))
C3 --- D3(( ))
C3 --- E3(( ))
D3 --- F3(( ))
D3 --- G3(( ))
style B3 opacity:0
linkStyle 18 stroke-width:0px
style E3 opacity:0
linkStyle 21 stroke-width:0px
style F3 opacity:0
linkStyle 22 stroke-width:0px
end
subgraph e [Hauteur 4]
direction TB
A4(( )) --- B4(( ))
A4 --- C4(( ))
C4 --- D4(( ))
C4 --- E4(( ))
D4 --- F4(( ))
D4 --- G4(( ))
style B4 opacity:0
linkStyle 24 stroke-width:0px
style E4 opacity:0
linkStyle 27 stroke-width:0px
style G4 opacity:0
linkStyle 29 stroke-width:0px
end
subgraph f [Hauteur 4]
direction TB
A5(( )) --- B5(( ))
A5 --- C5(( ))
B5 --- D5(( ))
B5 --- E5(( ))
E5 --- F5(( ))
E5 --- G5(( ))
style C5 opacity:0
linkStyle 31 stroke-width:0px
style D5 opacity:0
linkStyle 32 stroke-width:0px
style F5 opacity:0
linkStyle 34 stroke-width:0px
end
a x--x | | b x--x | | c x--x | | d x--x | | e x--x | | f
flowchart LR
subgraph a [Hauteur 3]
direction TB
A(( )) --- B(( ))
A --- C(( ))
B --- D(( ))
B --- E(( ))
style C opacity:0
linkStyle 1 stroke-width:0px
end
subgraph b [Hauteur 3]
direction TB
A1(( )) --- B1(( ))
A1 --- C1(( ))
C1 --- D1(( ))
C1 --- E1(( ))
style B1 opacity:0
linkStyle 4 stroke-width:0px
end
subgraph c [Hauteur 3]
direction TB
A4(( )) --- B4(( ))
A4 --- C4(( ))
B4 --- F4(( ))
B4 --- G4(( ))
style F4 opacity:0
linkStyle 10 stroke-width:0px
end
subgraph d [Hauteur 3]
direction TB
A3(( )) --- B3(( ))
A3 --- C3(( ))
C3 --- D3(( ))
C3 --- E3(( ))
style E3 opacity:0
linkStyle 15 stroke-width:0px
end
subgraph e [Hauteur 3]
direction TB
A2(( )) --- B2(( ))
A2 --- C2(( ))
B2 --- D2(( ))
B2 --- E2(( ))
style E2 opacity:0
linkStyle 19 stroke-width:0px
end
subgraph f [Hauteur 3]
direction TB
A5(( )) --- B5(( ))
A5 --- C5(( ))
C5 --- D5(( ))
C5 --- E5(( ))
style D5 opacity:0
linkStyle 22 stroke-width:0px
end
a x--x | | b x--x | | c x--x | | d x--x | | e x--x | | f
Activité 4 - Un arbre en python
Création de l'arbre
Une façon classique de représenter un arbre binaire en Python est de créer une classe Noeud :
class Noeud :
"""objet Noeud d'un arbre binaire"""
def __init__(self, val = None, filsG = None, filsD = None) :
self.set_val(val)
self.set_filsG(filsG)
self.set_filsD(filsD)
def get_val(self):
return self.val
def set_val(self, nouvelle_val):
self.val = nouvelle_val
def get_filsG(self):
return self.filsG
def set_filsG(self, nouveau_filsG):
self.filsG = nouveau_filsG
def get_filsD(self):
return self.filsD
def set_filsD(self, nouveau_filsD):
self.filsD = nouveau_filsD
def __str__(self):
return f"{self.get_val()}, {self.get_filsG()}, {self.get_filsD()}"
Le noeud contient 3 attributs : sa valeur, ses fils droit et gauche. On peut y ajouter un affichage basique.
Utilisation de la classe Noeud
Consigne :
- Implémenter l'arbre suivant :
Taille de l'arbre
Voici l'algorithme récursif de la fonction taille
:
Fonction taille(arbre):
Si arbre est vide :
Renvoyer 0
Sinon :
Renvoyer 1 + taille(arbre.filsG) + taille(arbre.filsD)
Fin Si
- Implémenter la fonction
taille
en vous aidant de l'algorithme précédent.
# Tests
(insensible Ă la casse)(Ctrl+I)
Taille de l'arbre
Voici l'algorithme récursif de la fonction hauteur
:
Fonction hauteur(arbre):
Si arbre est vide :
Renvoyer 0
Sinon :
Renvoyer 1 + max(hauteur(arbre.filsG) , hauteur(arbre.filsD))
Fin Si
- Implémenter la fonction
hauteur
# Tests
(insensible Ă la casse)(Ctrl+I)
Activité 5 - Parcours d'un arbre
On parcours un arbre pour "afficher" ou tester toutes les valeurs d'un arbres. Il existe 4 type de parcours :
On donne les algorithmes de parcours suivants :
Fonction parcours_prefixe(arbre):
Si arbre n'est pas vide :
Noeud â arbre.racine
Afficher Noeud.valeur
parcours_prefixe(arbre.gauche)
parcours_prefixe(arbre.droit)
Fin Si
Fonction parcours_infixe(arbre):
Si arbre n'est pas vide :
Noeud â arbre.racine
parcours_infixe(arbre.gauche)
Afficher Noeud.valeur
parcours_infixe(arbre.droit)
Fin Si
Fonction parcours_suffixe(arbre):
Si arbre n'est pas vide :
Noeud â arbre.racine
parcours_suffixe(arbre.gauche)
parcours_suffixe(arbre.droit)
Afficher Noeud.valeur
Fin Si
Fonction parcours_largeur(arbre):
Enfiler(f,arbre.racine)
Tant que f est non vide :
x â Defiler(f)
Afficher x.valeur
Si x.gauche est non nul :
filsG â x.gauche
Enfiler(f,filsG.racine)
Fin Si
Si x.droit est non nul :
filsD â x.droit
Enfiler(f,filsD.racine)
Fin Si
Fin Tant que
- Appliquez les 4 algorithmes "Ă la main" sur l'arbre binaire suivant et donner les valeurs dans l'ordre :
Correction
- Préfixe : A B C E D F G I H J
- Indixe : C E B D A I G F H J
- Suffixe : E C D B I G J H F A
- Largeur : A B F C D G H E I J
DĂ©finition d'un Arbre binaire de recherche (ABR)
Un arbre binaire de recherche est un arbre binaire dont les valeurs peuvent ĂȘtre comparĂ©es (entiers, flottants, caractĂšres, chaĂźnes...) avec la rĂšgle suivante :
Pour tout noeud de l'arbre :
- Toutes les valeurs situées dans le sous-arbre gauche sont plus petites que la valeur du noeud.
- Toutes les valeurs situées dans le sous-arbre droit sont plus grandes que la valeur du noeud.
Activité 7 - Algorithmes de recherche dans un ABR
Complétez l'activité précédente avec les autres algorithmes de recherche.
Application : algorithme de Huffman
Introduction
On cherche Ă crypter le mot Anticonstitutionnel sous forme dâune sĂ©rie de 0 et de 1.
- Proposez un cryptage possible.
- Quels peuvent ĂȘtre les inconvĂ©nients dâun tel cryptage?
Le principe de lâalgorithme de Huffman
Lâalgorithme de Huffman (ou codage de Huffman) permet aussi dâencoder un message texte sous forme dâune sĂ©rie de 0 et de 1. La diffĂ©rence, câest que ce codage sâappuie sur le nombre dâoccurrence de chaque caractĂšre.
LâidĂ©e consiste Ă coder les caractĂšres les plus frĂ©quents par des mots binaires plus courts que les caractĂšres les moins frĂ©quents. Si bien que chaque caractĂšre sera codĂ© avec un nombre diffĂ©rent de bits que dâautres caractĂšres du mĂȘme texte, compliquant sĂ©rieusement le dĂ©codage par une personne malveillante ayant interceptĂ© le message.
Arbre binaire de Huffman
Prenons toujours lâexemple du mot Anticonstitutionnel.
Comptage des occurrences
On indique pour chaque caractĂšre du mot le nombre dâoccurrence de ce caractĂšre dans le mot. (on pourra mettre les rĂ©sultats sous forme dâun tableau, dâun dictionnaireâŠ)
Tri par ordre croissant
On range cette « liste » dans lâordre croissant (ou dĂ©croissant) des nombres dâ occurrences.
Construction de lâarbre binaire « de Huffman »
On crĂ©e des feuilles pour chaque Ă©lĂ©ment de la « liste », chacune Ă©tiquetĂ©e par un couple (caractĂšre, nombre dâoccurrence).
On sĂ©lectionne les 2 feuilles dont le nombre dâoccurrence est le plus petit.
On fusionne ces 2 feuilles dans un nouvel arbre. LâĂ©tiquette de ce nouvel arbre sera (ââ,somme des poids des deux feuilles)
On supprime les 2 feuilles de la « liste » et on insÚre, à la bonne place, le nouvel arbre dans cette liste.
Par rĂ©currence, on « vide » la liste et lâensemble des feuilles et des arbres qui sây trouve. Au final, on obtient un arbre unique : lâarbre dâHuffman.
Mise en application : Codage
On peut maintenant utiliser cet arbre pour coder chaque caractĂšre : en parcourant lâarbre de la racine Ă une feuille, on notera 0 si on part Ă gauche ou 1 si on part Ă droite. On obtient ainsi la table de codage.
On obtient ainsi le codage d'Anticonstitutionnel :
11100011011011101111101001010110100011101101111010100000001
Mise en application : DĂ©codage
Un algorithme de cryptage ne servirait à rien si on ne pouvait pas décoder le message crypté.
Dans notre cas, lâarbre de Huffman va permettre aussi bien de coder que de dĂ©coder un message, tout simplement en prenant les nombres 0 et 1 les uns Ă la suite des autres, on parcourt lâarbre en partant de la racine de lâarbre et en allant jusquâĂ une feuille, puis en recommençant Ă partir de la racine.
Activité 8 - Utilisation de l'algorithmes de Huffman
1. Codage
En suivant lâalgorithme de Huffman, Dessiner les arbres des Huffman, et donner les tables de codages des mots suivants :
- Attention
- Institutionnalisation
2. DĂ©codage
On vous donne la sĂ©rie binaire et lâarbre de Huffman suivants :
110101101101001001111000010110011001111010101111111100100111010111011101110101000010011001100000001
Décoder la série binaire et donner le texte en clair.
Correction
1. Codage
En suivant lâalgorithme de Huffman, Dessiner les arbres des Huffman, et donner les tables de codages des mots suivants :
- Attention
- Institutionnalisation
2. DĂ©codage
On vous donne la sĂ©rie binaire et lâarbre de Huffman suivants :
110101101101001001111000010110011001111010101111111100100111010111011101110101000010011001100000001
Décoder la série binaire et donner le texte en clair.
'Warriors deux mille vingt'
# Tests
(insensible Ă la casse)(Ctrl+I)