> Les arbres binaires de recherche sont une structure de données fondamentale en informatique. Ils permettent d'effectuer des opérations de recherche, d'insertion et de suppression de manière efficace, avec une complexité moyenne en O(log n).
---
## 1. Définition
Un **Arbre Binaire de Recherche** (ABR) est un arbre binaire qui vérifie la propriété suivante pour **tout nœud N** :
- Toutes les valeurs du **sous-arbre gauche** sont **strictement inférieures** à la valeur de N
- Toutes les valeurs du **sous-arbre droit** sont **strictement supérieures** à la valeur de N
### Exemple d'ABR
```
8
/ \
3 10
/ \ \
1 6 14
/ \ /
4 7 13
```
Cet arbre est un ABR car :
- Pour le nœud 8 : tous les nœuds à gauche (3, 1, 6, 4, 7) sont <8,tousceuxàdroite(10,14,13)sont> 8
- Pour le nœud 3 : 1 <3et6> 3
- Et ainsi de suite pour tous les nœuds...
### Contre-exemple
```
8
/ \
3 10
/ \
1 9 ← 9 > 8, il devrait être à droite de 8 !
```
Cet arbre n'est **pas** un ABR car 9 est dans le sous-arbre gauche de 8 alors que 9 > 8.
---
## 2. Intérêt des ABR
### Pourquoi utiliser un ABR plutôt qu'une liste ?
| Opération | Liste non triée | Liste triée | ABR (équilibré) |
Une propriété remarquable des ABR : le **parcours infixe** donne les éléments **dans l'ordre croissant**.
```python
def parcours_infixe(noeud):
"""Affiche les éléments de l'ABR dans l'ordre croissant."""
if noeud is not None:
parcours_infixe(noeud.gauche)
print(noeud.valeur, end=" ")
parcours_infixe(noeud.droit)
```
Pour l'ABR d'exemple :
```
Parcours infixe : 1 3 4 6 7 8 10 13 14
```
---
## 8. Vérifier si un arbre est un ABR
Attention : il ne suffit pas de vérifier localement que `gauche < noeud < droit`. Il faut vérifier que **toutes** les valeurs du sous-arbre gauche sont inférieures.
mini et maxi définissent l'intervalle autorisé pour la valeur du nœud.
"""
if noeud is None:
return True
# La valeur doit être dans l'intervalle ]mini, maxi[
if not (mini <noeud.valeur<maxi):
return False
# Vérification récursive avec mise à jour des bornes
return (est_ABR(noeud.gauche, mini, noeud.valeur) and
est_ABR(noeud.droit, noeud.valeur, maxi))
```
---
## 9. Problème des arbres dégénérés
Si on insère des valeurs dans l'ordre croissant (1, 2, 3, 4, 5...), l'ABR devient une liste chaînée :
```
1
\
2
\
3
\
4
\
5
```
Dans ce cas, toutes les opérations deviennent en O(n) au lieu de O(log n).
### Solution : les arbres équilibrés
Pour garantir O(log n), on utilise des **arbres équilibrés** :
- **AVL** : après chaque insertion/suppression, on rééquilibre si nécessaire
- **Arbres rouge-noir** : utilisés dans beaucoup de bibliothèques standard
> Ces structures sont hors programme en NSI, mais il est important de comprendre pourquoi elles existent.
---
## 10. Résumé des complexités
| Opération | ABR équilibré | ABR dégénéré |
|-----------|---------------|--------------|
| Recherche | O(log n) | O(n) |
| Insertion | O(log n) | O(n) |
| Suppression | O(log n) | O(n) |
| Parcours complet | O(n) | O(n) |
---
## 11. Exercices
### Exercice 1 : Construction d'un ABR
Dessiner l'ABR obtenu après insertion successive des valeurs : 50, 30, 70, 20, 40, 60, 80, 35
### Exercice 2 : Recherche
Sur l'ABR de l'exercice 1, combien de comparaisons faut-il pour :
- Trouver 35 ?
- Constater que 45 n'est pas présent ?
### Exercice 3 : Suppression
Sur l'ABR de l'exercice 1, dessiner l'arbre après suppression de :
1. 20 (feuille)
2. 30 (nœud avec 2 enfants)
### Exercice 4 : Implémentation
Compléter la classe suivante avec les méthodes manquantes :
```python
class ABR:
def __init__(self):
self.racine = None
def inserer(self, valeur):
"""Insère une valeur dans l'ABR."""
pass
def rechercher(self, valeur):
"""Retourne True si valeur est dans l'ABR."""
pass
def supprimer(self, valeur):
"""Supprime une valeur de l'ABR."""
pass
def afficher_trie(self):
"""Affiche toutes les valeurs dans l'ordre croissant."""
pass
```
### Exercice 5 : Analyse
On insère n valeurs aléatoires dans un ABR initialement vide.
1. Quelle est la hauteur moyenne de l'arbre obtenu ?
2. Que se passe-t-il si les valeurs sont insérées dans l'ordre croissant ?
---
Auteur : Florian Mathieu
Licence CC BY NC
<arel="license"href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><imgalt="Licence Creative Commons"style="border-width:0"src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png"/></a><br/>Ce cours est mis à disposition selon les termes de la <arel="license"href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.