Exercice Arbres Python
Exercice Arbres Python
Algo_avancée_et_Prog___…
PDF
Et un code python
Parfait, j’ai tout le PDF (TP n°4 – Arbres) et j’ai bien compris tes contraintes :
✅ Contraintes obligatoires
Toujours deux structures :
Noeud et Arbre
[Link] 1/69
16/12/2025 20:50 Exercice arbres Python
Dès que tu confirmes, je commence en format parfait avec pseudo-code Pixees + Python
pour chaque question.
tout l'exos 1
Parfait. Voici TOUT l’EXERCICE 1, propre, complet, structuré, et conforme à toutes tes
contraintes :
🟦 STRUCTURES
📘 Pseudo-code
markdown
Structure Noeud
valeur
gauche
droite
FinStructure
Structure Arbre
racine
FinStructure
🐍 Python
[Link] 2/69
16/12/2025 20:50 Exercice arbres Python
python
class Noeud:
def __init__(self, valeur):
[Link] = valeur
[Link] = None
[Link] = None
class Arbre:
def __init__(self):
[Link] = None
cpp
Fonction EstVide(arbre)
Retourner [Link] = NULL
FinFonction
python
def est_vide(self):
return [Link] is None
Arbre.est_vide = est_vide
Copier le code
📘 Pseudo-code
java
[Link] 3/69
16/12/2025 20:50 Exercice arbres Python
🐍 Python
python
if [Link] is None:
[Link] = nouveau
return
courant = [Link]
if [Link] is None:
[Link] = nouveau
else:
[Link] = nouveau
[Link] = inserer
[Link] 4/69
16/12/2025 20:50 Exercice arbres Python
🐍 Python
Copier le code
python
[Link] = dfs
📘 Pseudo-code
csharp
🐍 Python
[Link] 5/69
16/12/2025 20:50 Exercice arbres Python
python
file = deque([[Link]])
while file:
courant = [Link]()
if [Link] == valeur:
return True
if [Link]:
[Link]([Link])
if [Link]:
[Link]([Link])
return False
[Link] = bfs
📘 Pseudo-code
cpp
Copier le code
Fonction Hauteur(noeud)
Si noeud = NULL → -1
Retourner 1 + max( Hauteur([Link]), Hauteur([Link]) )
FinFonction
🐍 Python
Copier le code
python
[Link] 6/69
16/12/2025 20:50 Exercice arbres Python
return -1
return 1 + max([Link]([Link]), [Link]([Link]))
[Link] = hauteur
Copier le code
6️⃣ Afficher l’arbre (parcours infixe)
📘 Pseudo-code
java
Procédure Afficher(noeud)
Si noeud = NULL → retour
Afficher([Link])
Écrire([Link])
Afficher([Link])
FinProcédure
🐍 Python
python Copier le code
[Link] = afficher
📘 Pseudo-code
csharp
[Link] 7/69
16/12/2025 20:50 Exercice arbres Python
🐍 Python
python
Copier le code
def profondeur(self, valeur):
if [Link] is None:
return -1
while file:
noeud, prof = [Link]()
if [Link] == valeur:
return prof
if [Link]:
[Link](([Link], prof+1))
if [Link]:
[Link](([Link], prof+1))
return -1
[Link] = profondeur
scss
Fonction TrouverFeuille(arbre)
Parcours BFS jusqu’à trouver un noeud sans enfants
[Link] 8/69
16/12/2025 20:50 Exercice arbres Python
FinFonction
🐍 Python
python
def _trouver_feuille(self):
file = deque([([Link], None)]) Copier le code
while file:
noeud, parent = [Link]()
if [Link] is None and [Link] is None:
return noeud, parent
if [Link]:
[Link](([Link], noeud))
if [Link]:
[Link](([Link], noeud))
[Link] 9/69
16/12/2025 20:50 Exercice arbres Python
if cible is None:
return
[Link] = [Link]
if parent_feuille is None:
[Link] = None
elif parent_feuille.gauche == feuille:
parent_feuille.gauche = None
else:
parent_feuille.droite = None
[Link] = supprimer
Procédure SupprimerArbre(arbre)
[Link] ← NULL
FinProcédure
python
def supprimer_arbre(self):
[Link] = None
Arbre.supprimer_arbre = supprimer_arbre
Copier le code
[Link] 10/69
16/12/2025 20:50 Exercice arbres Python
DFS itératif
🎯 Souhaites-tu maintenant :
1. Passer à l’exercice 2 (ABR)
2. Ajouter les bonus de l’exercice 1
3. Passer à l’exercice 3 (AVL)
Voici tout le code Python complet en 1 SEUL bloc, propre, prêt à copier-coller, avec un
test final pour vérifier que tout fonctionne.
import random
from collections import deque
# =========================
# STRUCTURES
# =========================
class Noeud:
def __init__(self, valeur):
[Link] = valeur
[Link] = None
[Link] = None
class Arbre:
def __init__(self):
[Link] = None
# =========================
[Link] 11/69
16/12/2025 20:50 Exercice arbres Python
# EST VIDE
# =========================
def est_vide(self):
return [Link] is None
# =========================
# INSERTION RANDOM
# =========================
def inserer(self, valeur):
nouveau = Noeud(valeur)
if [Link] is None:
[Link] = nouveau
return
courant = [Link]
while [Link] is not None and [Link] is not None:
if [Link](0, 1) == 0:
courant = [Link]
else:
courant = [Link]
if [Link] is None:
[Link] = nouveau
else:
[Link] = nouveau
# =========================
# DFS (profondeur)
# =========================
def dfs(self, noeud, valeur):
if noeud is None:
return False
if [Link] == valeur:
return True
return [Link]([Link], valeur) or [Link]([Link], valeur)
# =========================
# BFS (largeur)
# =========================
def bfs(self, valeur):
if [Link] is None:
return False
file = deque([[Link]])
[Link] 12/69
16/12/2025 20:50 Exercice arbres Python
while file:
courant = [Link]()
if [Link] == valeur:
return True
if [Link]:
[Link]([Link])
if [Link]:
[Link]([Link])
return False
# =========================
# HAUTEUR
# =========================
def hauteur(self, noeud):
if noeud is None:
return -1
return 1 + max([Link]([Link]), [Link]([Link]))
# =========================
# AFFICHAGE
# =========================
def afficher(self, noeud):
if noeud is None:
return
[Link]([Link])
print([Link], end=" ")
[Link]([Link])
# =========================
# PROFONDEUR D'UN NOEUD
# =========================
def profondeur(self, valeur):
if [Link] is None:
return -1
while file:
noeud, prof = [Link]()
if [Link] == valeur:
return prof
if [Link]:
[Link](([Link], prof+1))
[Link] 13/69
16/12/2025 20:50 Exercice arbres Python
if [Link]:
[Link](([Link], prof+1))
return -1
# =========================
# TROUVER FEUILLE (helper)
# =========================
def _trouver_feuille(self):
file = deque([([Link], None)])
while file:
noeud, parent = [Link]()
if [Link] is None and [Link] is None:
return noeud, parent
if [Link]:
[Link](([Link], noeud))
if [Link]:
[Link](([Link], noeud))
# =========================
# SUPPRIMER UN ELEMENT
# =========================
def supprimer(self, valeur):
if [Link] is None:
return
# Trouver la cible
while file:
noeud, parent = [Link]()
if [Link] == valeur:
cible = noeud
parent_cible = parent
break
if [Link]:
[Link](([Link], noeud))
if [Link]:
[Link](([Link], noeud))
if cible is None:
return # valeur non trouvée
[Link] 14/69
16/12/2025 20:50 Exercice arbres Python
# On supprime la feuille
if parent_feuille is None:
[Link] = None
elif parent_feuille.gauche == feuille:
parent_feuille.gauche = None
else:
parent_feuille.droite = None
# =========================
# SUPPRIMER TOUT L’ARBRE
# =========================
def supprimer_arbre(self):
[Link] = None
# ============================================
# TEST COMPLET DE L’EXERCICE 1
# ============================================
if __name__ == "__main__":
a = Arbre()
print("\nSuppression de 5…")
[Link] 15/69
16/12/2025 20:50 Exercice arbres Python
[Link](5)
print("Affichage après suppression : ", end="")
[Link]([Link])
Ok, pause : il faut que je sois sûr de ce que ton prof interdit exactement, parce que ça
change TOUT le design de ton code.
Tu dis :
« mon prof veut pas qu'on utilise courant = [Link] il trouve ça inutile »
[Link] 16/69
16/12/2025 20:50 Exercice arbres Python
Et la fonction privée :
C’est la logique standard pour les profs qui veulent obliger à utiliser la structure d’arbre
sans variable intermédiaire.
courant = [Link]
Donc obligation d’utiliser des fonctions récursives, comme pour un arbre de recherche ➜
insert(node) ?
[Link] 17/69
16/12/2025 20:50 Exercice arbres Python
👉 Dis-moi A / B / C
Dès que tu me réponds, je te refais :
tout l’EXERCICE 1
code Python en 1 seul bloc
insertion strictement conforme à la règle du prof
tests complets
courant = [Link]
ou
n = [Link]
[Link] 18/69
16/12/2025 20:50 Exercice arbres Python
🟢 Solution autorisée
➡️ Utiliser une seule fonction publique
➡️ qui appelle une fonction récursive interne, en passant le nœud en paramètre, SANS
jamais le copier.
👉 Ça respecte totalement la logique “on manipule l’arbre, pas des pointeurs copiés”.
import random
from collections import deque
# =======================================
# STRUCTURES
# =======================================
class Noeud:
def __init__(self, valeur):
[Link] = valeur
[Link] = None
[Link] = None
class Arbre:
def __init__(self):
[Link] = None
# ===============================
# ARBRE VIDE ?
# ===============================
def est_vide(self):
return [Link] is None
[Link] 19/69
16/12/2025 20:50 Exercice arbres Python
# ===============================
# INSERTION RANDOM
# ===============================
def inserer(self, valeur):
[Link] = self._inserer_rec([Link], valeur)
return noeud
# ===============================
# DFS
# ===============================
def dfs(self, noeud, valeur):
if noeud is None:
return False
if [Link] == valeur:
return True
return [Link]([Link], valeur) or [Link]([Link], valeur)
# ===============================
# BFS
# ===============================
def bfs(self, valeur):
if [Link] is None:
return False
file = deque([[Link]])
[Link] 20/69
16/12/2025 20:50 Exercice arbres Python
while file:
n = [Link]()
if [Link] == valeur:
return True
if [Link]:
[Link]([Link])
if [Link]:
[Link]([Link])
return False
# ===============================
# HAUTEUR
# ===============================
def hauteur(self, noeud):
if noeud is None:
return -1
return 1 + max([Link]([Link]), [Link]([Link]))
# ===============================
# AFFICHAGE
# ===============================
def afficher(self, noeud):
if noeud is None:
return
[Link]([Link])
print([Link], end=" ")
[Link]([Link])
# ===============================
# PROFONDEUR D'UN NOEUD
# ===============================
def profondeur(self, valeur):
if [Link] is None:
return -1
while file:
n, p = [Link]()
if [Link] == valeur:
return p
if [Link]:
[Link] 21/69
16/12/2025 20:50 Exercice arbres Python
[Link](([Link], p + 1))
if [Link]:
[Link](([Link], p + 1))
return -1
# ===============================
# TROUVER UNE FEUILLE
# ===============================
def _trouver_feuille(self):
file = deque([([Link], None)])
while file:
n, parent = [Link]()
if [Link] is None and [Link] is None:
return n, parent
if [Link]:
[Link](([Link], n))
if [Link]:
[Link](([Link], n))
# ===============================
# SUPPRESSION VALEUR
# ===============================
def supprimer(self, valeur):
if [Link] is None:
return
# Cherche la cible
file = deque([([Link], None)])
cible = None
parent = None
while file:
n, p = [Link]()
if [Link] == valeur:
cible = n
parent = p
break
if [Link]:
[Link](([Link], n))
if [Link]:
[Link](([Link], n))
if cible is None:
return
[Link] 22/69
16/12/2025 20:50 Exercice arbres Python
# Supprime la feuille
if parent_feuille is None:
[Link] = None
elif parent_feuille.gauche == feuille:
parent_feuille.gauche = None
else:
parent_feuille.droite = None
# ===============================
# SUPPRESSION ARBRE
# ===============================
def supprimer_arbre(self):
[Link] = None
# =======================================
# TEST COMPLET
# =======================================
if __name__ == "__main__":
a = Arbre()
[Link] 23/69
16/12/2025 20:50 Exercice arbres Python
print("\nSuppression de 5…")
[Link](5)
print("Affichage :", end=" ")
[Link]([Link])
🎯 Important
Ce code respecte 100% :
Tu veux maintenant :
🔵 Exercice 2 — ABR (Arbre Binaire de Recherche) ?
🔵 Exercice 3 — AVL ?
🔵 Ou les bonus de l'exercice 1 ?
Bien sûr !
Voici TOUT le pseudo-code de l’EXERCICE 1, parfaitement propre, concis, style Pixees, et
surtout adapté à ta version finale sans copie de pointeur (donc insertion récursive).
🟦 STRUCTURES
markdown Copier le code
Structure Noeud
valeur
gauche
droite
FinStructure
Structure Arbre
racine
FinStructure
Fonction EstVide(arbre)
Retourner ([Link] = NULL)
FinFonction
[Link] 25/69
16/12/2025 20:50 Exercice arbres Python
choix ← random(0,1)
Si choix = 0 alors
[Link] ← InsererRec([Link], valeur)
Sinon
[Link] ← InsererRec([Link], valeur)
FinSi
Retourner noeud
FinSi
Retourner noeud
FinFonction
[Link] 26/69
16/12/2025 20:50 Exercice arbres Python
file ← FileVide
Enfiler(file, [Link])
Retourner Faux
FinFonction
Fonction Hauteur(noeud)
Si noeud = NULL alors
Retourner -1
FinSi
h_gauche ← Hauteur([Link])
h_droite ← Hauteur([Link])
Procédure Afficher(noeud)
Si noeud = NULL alors
Retour
FinSi
[Link] 27/69
16/12/2025 20:50 Exercice arbres Python
Afficher([Link])
AfficherValeur([Link])
Afficher([Link])
FinProcédure
file ← FileVide
Enfiler(file, ([Link], 0))
Retourner -1
FinFonction
Fonction TrouverFeuille(arbre)
file ← [([Link], NULL)]
[Link] 28/69
16/12/2025 20:50 Exercice arbres Python
[Link] 29/69
16/12/2025 20:50 Exercice arbres Python
# Remplacer la valeur
[Link] ← [Link]
# Supprimer la feuille
Si parent_feuille = NULL alors
[Link] ← NULL
SinonSi parent_feuille.gauche = feuille alors
parent_feuille.gauche ← NULL
Sinon
parent_feuille.droite ← NULL
FinSi
FinProcédure
Procédure SupprimerArbre(arbre)
[Link] ← NULL
FinProcédure
Procédure SupprimerArbre(arbre)
[Link] ← NULL
FinProcédure
[Link] 30/69
16/12/2025 20:50 Exercice arbres Python
Procédure SupprimerArbre(arbre)
[Link] ← NULL
FinProcédure
💡 Pourquoi ça suffit ?
Parce que :
🎯 Conclusion
➡️ Oui, mettre [Link] ← NULL suffit à supprimer l'arbre.
➡️ C’est même la méthode officielle, propre et la plus simple.
l’exercice 2 (ABR)
l’exercice 3 (AVL)
ou les bonus de l’exercice 1
Tu choisis !
[Link] 31/69
16/12/2025 20:50 Exercice arbres Python
go exo 2
🔹 STRUCTURES
markdown Copier le code
Structure Noeud
valeur
gauche
droite
FinStructure
Structure Arbre
racine
FinStructure
[Link] 32/69
16/12/2025 20:50 Exercice arbres Python
Fonction EstVide(arbre)
Retourner ([Link] = NULL)
FinFonction
Retourner noeud
FinFonction
[Link] 33/69
16/12/2025 20:50 Exercice arbres Python
FinSi
4️⃣ Hauteur
Identique à l’exercice 1.
Fonction Hauteur(noeud)
Si noeud = NULL → -1
Retourner 1 + max( Hauteur([Link]), Hauteur([Link]) )
FinFonction
Procédure Afficher(noeud)
Si noeud = NULL retourner
Afficher([Link])
AfficherValeur([Link])
Afficher([Link])
FinProcédure
Fonction Min(noeud)
Tant que [Link] ≠ NULL faire
noeud ← [Link]
FinTantQue
[Link] 34/69
16/12/2025 20:50 Exercice arbres Python
Retourner noeud
FinFonction
Sinon
# trouvé
Si [Link] = NULL alors
Retourner [Link]
Retourner noeud
FinFonction
[Link] 35/69
16/12/2025 20:50 Exercice arbres Python
Procédure SupprimerArbre(arbre)
[Link] ← NULL
FinProcédure
# ======================================
# ARBRE BINAIRE DE RECHERCHE (ABR)
# ======================================
class Noeud:
def __init__(self, valeur):
[Link] = valeur
[Link] = None
[Link] = None
class Arbre:
def __init__(self):
[Link] = None
# -------------------------------
# EST VIDE ?
# -------------------------------
def est_vide(self):
return [Link] is None
# -------------------------------
# INSERTION (récursive)
# -------------------------------
def inserer(self, valeur):
[Link] = self._inserer_rec([Link], valeur)
[Link] 36/69
16/12/2025 20:50 Exercice arbres Python
return noeud
# -------------------------------
# RECHERCHE (récursive)
# -------------------------------
def rechercher(self, noeud, valeur):
if noeud is None:
return False
if [Link] == valeur:
return True
if valeur < [Link]:
return [Link]([Link], valeur)
return [Link]([Link], valeur)
# -------------------------------
# HAUTEUR
# -------------------------------
def hauteur(self, noeud):
if noeud is None:
return -1
return 1 + max([Link]([Link]), [Link]([Link]))
# -------------------------------
# AFFICHAGE INFIXE (trié)
# -------------------------------
def afficher(self, noeud):
if noeud is None:
return
[Link]([Link])
print([Link], end=" ")
[Link]([Link])
# -------------------------------
# MINIMUM D'UN SOUS-ARBRE
# -------------------------------
def _min(self, noeud):
while [Link] is not None:
noeud = [Link]
return noeud
# -------------------------------
[Link] 37/69
16/12/2025 20:50 Exercice arbres Python
# SUPPRESSION
# -------------------------------
def supprimer(self, valeur):
[Link] = self._supprimer_rec([Link], valeur)
else:
# cas 1 : aucun enfant
if [Link] is None and [Link] is None:
return None
return noeud
# -------------------------------
# SUPPRIMER ARBRE COMPLET
# -------------------------------
def supprimer_arbre(self):
[Link] = None
# ======================================
# TEST
# ======================================
if __name__ == "__main__":
a = Arbre()
[Link] 38/69
16/12/2025 20:50 Exercice arbres Python
# insertion
for v in [10, 5, 20, 3, 7, 15, 30]:
[Link](v)
print("\nSuppression de 10 (racine)…")
[Link](10)
print("Après suppression :", end=" ")
[Link]([Link])
🎉 EXERCICE 2 TERMINÉ
Tu veux que je fasse maintenant :
Tu choisis !
Excellente question, et ta compréhension sera très importante pour réussir ton TP (surtout
en pseudo-code).
Voici la différence claire, simple et propre entre une fonction et une procédure.
[Link] 39/69
16/12/2025 20:50 Exercice arbres Python
🟦 1. FONCTION
👉 Une fonction retourne une valeur.
Elle fait un calcul, et renvoie un résultat que l’on peut utiliser dans une expression.
📌 Exemple :
scss Copier le code
x ← Somme(5, 7)
Fonction Max(a, b)
Si a > b alors
Retourner a
Sinon
Retourner b
FinSi
FinFonction
🟩 2. PROCÉDURE
👉 Une procédure ne retourne PAS de valeur.
Elle fait une action, mais ne produit pas de résultat exploitable dans une expression.
📌 Exemple :
scss Copier le code
[Link] 40/69
16/12/2025 20:50 Exercice arbres Python
Appeler Afficher(arbre)
x ← Afficher(arbre) // incorrect
✔ Utilisation typique :
java Copier le code
Procédure Afficher(noeud)
Si noeud = NULL → Retour
Afficher([Link])
Écrire([Link])
Afficher([Link])
FinProcédure
🟨 Résumé rapide
Mot Retourne une valeur ? Sert à quoi ?
SupprimerArbre(arbre) → procédure
✔ FONCTIONS
Hauteur(noeud) → fonction
Sinon
# trouvé
Si [Link] = NULL alors
Retourner [Link]
Retourner noeud
FinFonction
Je t’explique clairement 👇
🟦 Exemple : ABR
markdown Copier le code
10
/ \
5 20
[Link] 43/69
16/12/2025 20:50 Exercice arbres Python
/ \
15 30
Suppression de 20 :
→ le minimum du sous-arbre droit = 30
→ on remplace 20 par 30
→ c’est correct, car 30 > 10
Copier le code
[Link] ← remplaç[Link]
Car cette nouvelle valeur peut devenir fausse par rapport à la structure.
10
/ \
50 3
Tu obtiens :
[Link] 44/69
16/12/2025 20:50 Exercice arbres Python
3
/ \
50 X
Et pire encore :
si tu remplaces par une valeur venant de n’importe où
tu détruis toute la structure
tu crées des cas incohérents
🟦 Résumé simple
🟢 ABR → structure ordonnée
→ suppression = remplacer par min du sous-arbre droit
→ garde l’ordre intact
🟣 Conclusion
👉 On ne peut pas utiliser la suppression de l’ABR dans un arbre simple
👉 car elle dépend de l’ordre des valeurs, que l’arbre simple n’a pas
👉 Dans l’arbre simple, on remplace par une feuille, pas par le minimum
Si tu veux, je peux te refaire un schéma explicatif propre pour mettre dans ton rendu.
➡️ Ce qui pose problème dans l’arbre simple (Exo 1), ce n’est pas Min()…
… c’est que l’arbre simple n’a PAS de profondeur ordonnée.
Cette logique dépend uniquement de l’ordre → valeur < [Link] < valeur droite
[Link] 46/69
16/12/2025 20:50 Exercice arbres Python
Donc :
Pourquoi ?
Parce que dans un arbre non ordonné, tu ne sais pas dans quel sous-arbre chercher.
Donc :
[Link] 47/69
16/12/2025 20:50 Exercice arbres Python
🟢 ABR (Exo 2)
ordonné
la profondeur dépend de l’ordre, donc la récursion fonctionne
on sait où chercher
on peut faire :
✔ recherche récursive
✔ suppression récursive
✔ Min([Link])
✔ Max([Link])
Si tu veux, je peux t’écrire une explication encore plus courte pour mettre dans un
compte-rendu, ou des schémas pour visualiser.
Donc ✔️ : Il faut bien la fonction PRO FON DEUR dans l’ABR, comme dans l’exercice 1.
Je te fais donc :
[Link] 48/69
16/12/2025 20:50 Exercice arbres Python
Retourner -1
FinFonction
✔️ identique à Exo 1
✔️ car la profondeur = distance depuis la racine
✔️ pas liée à l’ordre de l’ABR
[Link] 49/69
16/12/2025 20:50 Exercice arbres Python
return -1
while file:
noeud, prof = [Link]()
if [Link] == valeur:
return prof
if [Link]:
[Link](([Link], prof + 1))
if [Link]:
[Link](([Link], prof + 1))
return -1
👉 Donc en ABR, on utilise exactement la même méthode que dans un arbre simple.
🟩 4. Résumé clair
Ce qu’il faut pour EXO 2 :
✔ Insertion récursive (avec ordre)
✔ Recherche récursive
✔ Suppression avec Min()
✔ Hauteur
✔ Affichage infixe
✔ Profondeur (BFS)
✔ SupprimerArbre
[Link] 50/69
16/12/2025 20:50 Exercice arbres Python
Exactement 😊
👉 La profondeur est la même dans l’arbre simple et dans l’ABR,
parce qu’elle ne dépend pas de l’ordre, seulement du nombre de niveaux.
le même pseudo-code
le même code Python
✔️ Pas de piège
✔️ Tu avais tout bon
✔️ Et ton prof sera content que tu aies compris pourquoi
Tu me dis !
exo 3
[Link] 51/69
16/12/2025 20:50 Exercice arbres Python
Règle AVL :
| hauteur(gauche) – hauteur(droite) | ≤ 1
🔹 1. STRUCTURES
markdown Copier le code
Structure Noeud
valeur
gauche
droite
hauteur
FinStructure
Structure Arbre
racine
FinStructure
🔹 2. Fonction Hauteur(noeud)
cpp Copier le code
[Link] 52/69
16/12/2025 20:50 Exercice arbres Python
Fonction Hauteur(noeud)
Si noeud = NULL alors Retourner -1
Retourner [Link]
FinFonction
Procédure MAJHauteur(noeud)
[Link] ← 1 + max( Hauteur([Link]), Hauteur([Link]) )
FinProcédure
🔹 4. Facteur d’équilibre
scss Copier le code
Fonction Equilibre(noeud)
Retourner Hauteur([Link]) - Hauteur([Link])
FinFonction
🔹 5. Rotation droite
scss Copier le code
Fonction RotationDroite(y)
x ← [Link]
T2 ← [Link]
[Link] ← y
[Link] ← T2
MAJHauteur(y)
MAJHauteur(x)
Retourner x
FinFonction
[Link] 53/69
16/12/2025 20:50 Exercice arbres Python
🔹 6. Rotation gauche
scss Copier le code
Fonction RotationGauche(x)
y ← [Link]
T2 ← [Link]
[Link] ← x
[Link] ← T2
MAJHauteur(x)
MAJHauteur(y)
Retourner y
FinFonction
MAJHauteur(noeud)
balance ← Equilibre(noeud)
# 4 cas AVL
# Gauche-Gauche
Si balance > 1 ET valeur < [Link] alors
Retourner RotationDroite(noeud)
[Link] 54/69
16/12/2025 20:50 Exercice arbres Python
# Gauche-Droite
Si balance > 1 ET valeur > [Link] alors
[Link] ← RotationGauche([Link])
Retourner RotationDroite(noeud)
# Droite-Droite
Si balance < -1 ET valeur > [Link] alors
Retourner RotationGauche(noeud)
# Droite-Gauche
Si balance < -1 ET valeur < [Link] alors
[Link] ← RotationDroite([Link])
Retourner RotationGauche(noeud)
Retourner noeud
FinFonction
Fonction Min(noeud)
Tant que [Link] ≠ NULL faire
noeud ← [Link]
FinTantQue
Retourner noeud
FinFonction
[Link] 55/69
16/12/2025 20:50 Exercice arbres Python
Sinon
# Cas 1 et 2 : 0 ou 1 enfant
Si [Link] = NULL alors Retourner [Link]
Si [Link] = NULL alors Retourner [Link]
MAJHauteur(noeud)
balance ← Equilibre(noeud)
Retourner noeud
FinFonction
Procédure SupprimerArbre(arbre)
[Link] ← NULL
FinProcédure
[Link] 56/69
16/12/2025 20:50 Exercice arbres Python
➡️ Dis-moi Oui si tu veux le code complet Python d’un seul bloc comme pour les exos
précédents.
pyhton un bloc
Voici tout le code Python en 1 seul bloc pour l'exercice 3 (AVL) — insertion récursive (pas
de copie de pointeur), rotations, suppression équilibrée, recherche, affichage, hauteur et
profondeur. Test complet à la fin.
# =========================
# STRUCTURES AVL
# =========================
class Noeud:
def __init__(self, valeur):
[Link] = valeur
[Link] = None
[Link] = None
[Link] = 0 # hauteur d'un noeud feuille = 0
class ArbreAVL:
def __init__(self):
[Link] = None
# -------------------------
# utilitaires hauteur/equilibre
# -------------------------
def hauteur(self, noeud):
[Link] 57/69
16/12/2025 20:50 Exercice arbres Python
# -------------------------
# rotations
# -------------------------
def rotation_droite(self, y):
"""
Rotation droite :
y x
/ \ / \
x T3 -> T1 y
/ \ / \
T1 T2 T2 T3
"""
x = [Link]
T2 = [Link]
# effectuer rotation
[Link] = y
[Link] = T2
return x
[Link] 58/69
16/12/2025 20:50 Exercice arbres Python
/ \ / \
T2 T3 T1 T2
"""
y = [Link]
T2 = [Link]
# effectuer rotation
[Link] = x
[Link] = T2
return y
# -------------------------
# insertion AVL (publique)
# -------------------------
def inserer(self, valeur):
[Link] = self._inserer_rec([Link], valeur)
# cas Gauche-Gauche
if balance > 1 and valeur < [Link]:
return self.rotation_droite(noeud)
# cas Gauche-Droite
if balance > 1 and valeur > [Link]:
[Link] = self.rotation_gauche([Link])
return self.rotation_droite(noeud)
# cas Droite-Droite
[Link] 59/69
16/12/2025 20:50 Exercice arbres Python
# cas Droite-Gauche
if balance < -1 and valeur < [Link]:
[Link] = self.rotation_droite([Link])
return self.rotation_gauche(noeud)
return noeud
# -------------------------
# recherche (récursive)
# -------------------------
def rechercher(self, noeud, valeur):
if noeud is None:
return False
if [Link] == valeur:
return True
if valeur < [Link]:
return [Link]([Link], valeur)
return [Link]([Link], valeur)
# -------------------------
# affichage infixe (trié)
# -------------------------
def afficher(self, noeud):
if noeud is None:
return
[Link]([Link])
print([Link], end=" ")
[Link]([Link])
# -------------------------
# profondeur (BFS)
# -------------------------
def profondeur(self, valeur):
if [Link] is None:
return -1
q = deque([([Link], 0)])
while q:
n, p = [Link]()
if [Link] == valeur:
return p
if [Link]:
[Link](([Link], p + 1))
if [Link]:
[Link] 60/69
16/12/2025 20:50 Exercice arbres Python
[Link](([Link], p + 1))
return -1
# -------------------------
# minimum d'un sous-arbre
# -------------------------
def _min(self, noeud):
if noeud is None:
return None
while [Link] is not None:
noeud = [Link]
return noeud
# -------------------------
# suppression AVL (publique)
# -------------------------
def supprimer(self, valeur):
[Link] = self._supprimer_rec([Link], valeur)
[Link] 61/69
16/12/2025 20:50 Exercice arbres Python
balance = [Link](noeud)
# cas Gauche-Gauche
if balance > 1 and [Link]([Link]) >= 0:
return self.rotation_droite(noeud)
# cas Gauche-Droite
if balance > 1 and [Link]([Link]) < 0:
[Link] = self.rotation_gauche([Link])
return self.rotation_droite(noeud)
# cas Droite-Droite
if balance < -1 and [Link]([Link]) <= 0:
return self.rotation_gauche(noeud)
# cas Droite-Gauche
if balance < -1 and [Link]([Link]) > 0:
[Link] = self.rotation_droite([Link])
return self.rotation_gauche(noeud)
return noeud
# -------------------------
# supprimer tout l'arbre
# -------------------------
def supprimer_arbre(self):
[Link] = None
# =========================
# TEST
# =========================
if __name__ == "__main__":
avl = ArbreAVL()
valeurs = [10, 20, 30, 40, 50, 25] # cas classique provoquant rotations
print("Insertion :", valeurs)
for v in valeurs:
[Link](v)
# recherches
print("\nRecherche 25 :", [Link]([Link], 25))
[Link] 62/69
16/12/2025 20:50 Exercice arbres Python
# profondeur
print("\nProfondeur de 25 :", [Link](25))
print("Profondeur de 10 :", [Link](10))
# suppression racine
print("\nSuppression de 30 (peut être racine ou non selon rééquilibrage)...")
[Link](30)
print("Affichage après suppression :", end=" ")
[Link]([Link])
print("\nHauteur racine :", [Link]([Link]))
print("Équilibre racine :", [Link]([Link]))
# vider l'arbre
print("\nVider l'arbre...")
avl.supprimer_arbre()
print("Arbre vide ?", [Link] is None)
Si tu veux que je :
dis-le et je le fais.
Parfait 👍
Je vais te faire un document clair, propre, prêt à mettre dans ton compte-rendu, avec :
[Link] 63/69
16/12/2025 20:50 Exercice arbres Python
✔️ EstVide()
Temps : O(1)
Espace : O(1)
→ On teste simplement si la racine est None .
✔️ Insertion (aléatoire)
Temps : O(h) où h = hauteur
→ pire cas : O(n)
Espace : O(h) → récursion
→ On descend aléatoirement jusqu’à un emplacement libre.
✔️ DFS (récursif)
Temps : O(n)
Espace : O(h) → pile récursive
→ On explore potentiellement tout l’arbre.
✔️ BFS
Temps : O(n)
Espace : O(n) → file
→ On parcourt tous les nœuds niveau par niveau.
[Link] 64/69
16/12/2025 20:50 Exercice arbres Python
✔️ Hauteur()
Temps : O(n)
Espace : O(h)
→ On visite chaque nœud pour calculer sa hauteur.
✔️ Affichage (Infixe)
Temps : O(n)
Espace : O(h)
→ On doit visiter tous les nœuds.
✔️ Profondeur()
Temps : O(n)
Espace : O(n)
→ BFS jusqu’au nœud cherché.
✔️ Supprimer un élément
Temps : O(n)
Espace : O(n)
→ Il faut :
1. chercher la valeur (BFS)
2. chercher une feuille
3. remplacer la valeur
✔️ EstVide()
Temps : O(1)
Espace : O(1)
✔️ Insertion (récursive)
Temps :
cas moyen : O(log n)
pire cas : O(n)
Espace : O(h) → récursion
✔️ Recherche (récursive)
Temps :
moyen : O(log n)
pire : O(n)
Espace : O(h)
✔️ Hauteur()
Temps : O(n)
Espace : O(h)
→ doit parcourir tout l’arbre.
✔️ Affichage infixe
Temps : O(n)
Espace : O(h)
✔️ Profondeur()
Temps : O(n)
Espace : O(n)
→ BFS non optimisé.
✔️ Min()
[Link] 66/69
16/12/2025 20:50 Exercice arbres Python
Temps :
moyen : O(log n)
pire : O(n)
Espace : O(1)
→ on descend toujours à gauche.
✔️ Suppression (récursive)
Temps :
moyen : O(log n)
pire : O(n)
Espace : O(h)
✔️ Supprimer l’arbre
Temps : O(1)
Espace : O(1)
🌳 EXERCICE 3 — AVL
⚠️ Les AVL sont équilibrés, donc la hauteur = O(log n).
✔️ Hauteur(noeud)
Temps : O(1) (on lit un champ)
Espace : O(1)
✔️ MAJHauteur()
Temps : O(1)
Espace : O(1)
✔️ Équilibre()
Temps : O(1)
Espace : O(1)
[Link] 67/69
16/12/2025 20:50 Exercice arbres Python
✔️ Insertion AVL
Temps : O(log n)
Espace : O(log n)
→ insertion BST classique + une rotation max.
✔️ Recherche
Temps : O(log n)
Espace : O(log n)
✔️ Affichage infixe
Temps : O(n)
Espace : O(log n)
✔️ Profondeur() (BFS)
Temps : O(n)
Espace : O(n)
→ indépendant de la structure.
✔️ Min()
Temps : O(log n)
Espace : O(1)
✔️ Suppression AVL
Temps : O(log n)
Espace : O(log n)
→ suppression BST + rééquilibrage + rotations.
[Link] 68/69
16/12/2025 20:50 Exercice arbres Python
✔️ Supprimer l’arbre
Temps : O(1)
Espace : O(1)
[Link] 69/69