Séance 1 — Vocabulaire et implémentation
1. Qu'est-ce qu'un arbre binaire ?
Un arbre binaire est une structure hiérarchique où chaque nœud a au maximum deux enfants (fils gauche et fils droit).
2. Exercice 1 — Lecture de vocabulaire
Sur l'arbre fourni en support : a) racine ? b) feuilles ? c) profondeur d'un nœud donné ? d) hauteur ? e) taille ?
3. Les arbres sont des structures récursives
Un arbre binaire est soit vide, soit un nœud racine avec deux sous-arbres (éventuellement vides), eux-mêmes des arbres binaires. C'est la base de la récursivité.
4. Formes extrêmes et encadrement
Filiforme (dégénéré) : chaque nœud n'a qu'un seul fils, hauteur = n. Complet/parfait : tous les niveaux remplis, hauteur ≈ log₂(n). Pour tout arbre : log₂(n) ≤ h ≤ n - 1.
5. Exercice 2 — Encadrement taille/hauteur
a) Nœuds max d'un arbre complet de hauteur 6 ? b) Encadrement de la hauteur pour n = 24 ? c) Dessine un arbre de hauteur 4 avec un maximum de nœuds.
Voir la réponse
b) log₂(24) ≈ 4,58 → 4 ≤ h ≤ 23.
c) Arbre complet de hauteur 4 : 1+2+4+8 = 15 nœuds (2⁴ - 1).
6. Exercice 3 — Implémentation avec la classe Noeud
class Noeud:
def __init__(self, e, g=None, d=None):
self.etiquette = e
self.gauche = g
self.droit = d
def est_feuille(self):
return self.gauche is None and self.droit is None
a) Construis : racine 2, fils gauche 8 (fils 4, 5), fils droit 9 (fils droit 3). b) Affiche l'arbre. c) Vérifie est_feuille() sur le nœud 4.
Voir la réponse
A1 = Noeud(2, Noeud(8, Noeud(4), Noeud(5)), Noeud(9, None, Noeud(3)))
print(A1) # 2-(8-(4,5),9-(None,3))
print(A1.gauche.gauche.est_feuille()) # True
7. Exercice 4 — hauteur() et taille() récursives
a) Complète taille(A). b) Complète hauteur(A) (arbre vide → -1). c) Teste sur l'arbre construit.
Voir la réponse
def taille(A):
if A is None:
return 0
return 1 + taille(A.gauche) + taille(A.droit)
def hauteur(A):
if A is None:
return -1
return 1 + max(hauteur(A.gauche), hauteur(A.droit))
Exercices défis (bonus)
Voir la réponse
def parfait(h):
if h == 0:
return None
return Noeud(f'Niveau{h}', parfait(h-1), parfait(h-1))
Voir la réponse
def peigne_gauche(h):
if h == 0:
return None
return Noeud(f'Niveau{h}', peigne_gauche(h-1), None)
Combien de formes d'arbres binaires différentes existent pour 5 nœuds ?