Menu
Coddy logo textTech

Arbre binaire

Dernière mise à jour

Un arbre binaire est une hiérarchie où chaque nœud possède au plus deux enfants, appelés enfant gauche et enfant droit. Le nœud supérieur est la racine, les nœuds sans enfant sont des feuilles, et le nombre d'arêtes de la racine jusqu'à la feuille la plus profonde est la hauteur de l'arbre. Contrairement à un arbre binaire de recherche, un arbre binaire simple n'a aucune règle d'ordre : ce n'est que la forme. Appuyez sur lecture ci-dessus pour voir un arbre se remplir niveau par niveau, puis être parcouru en infixe (gauche, nœud, droite).

Les arbres binaires sont à la base de nombreuses structures : arbres binaires de recherche, tas, arbres d'expression et bien d'autres. Les parcours visitent chaque nœud dans un ordre défini : infixe, préfixe et postfixe sont les trois parcours en profondeur, chacun utile pour des tâches différentes.

Terminologie

TermeSignification
RacineLe nœud supérieur, sans parent
FeuilleUn nœud sans enfant
HauteurLe plus long chemin racine-feuille (en arêtes)
ProfondeurDistance d'un nœud par rapport à la racine
CompletTous les niveaux pleins sauf peut-être le dernier, rempli de gauche à droite

Les trois parcours en profondeur

ParcoursOrdreUsage courant
InfixeGauche, nœud, droiteSortie triée d'un BST
PréfixeNœud, gauche, droiteCopier / sérialiser un arbre
PostfixeGauche, droite, nœudSupprimer / évaluer un arbre

Exemple détaillé

Parcours infixe de l'arbre construit à partir de [4, 2, 6, 1, 3, 5] (rempli niveau par niveau) :

ÉtapeAu nœudAction
14Récursion dans le sous-arbre gauche de 4 avant de le visiter
22Récursion dans le sous-arbre gauche de 2 avant de le visiter
31Feuille, pas d'enfant gauche : on visite 1, sortie [1]
42Gauche terminée : on visite 2, sortie [1, 2], puis récursion à droite
53Feuille : on visite 3, sortie [1, 2, 3]
64Sous-arbre gauche terminé : on visite 4, sortie [1, 2, 3, 4], puis récursion à droite
75Enfant gauche de 6, une feuille : on visite 5, sortie [1, 2, 3, 4, 5]
86Gauche terminée, pas d'enfant droit : on visite 6, sortie [1, 2, 3, 4, 5, 6]

Quand utiliser un arbre binaire

À utiliser quandÀ éviter quand
Vous devez modéliser des données intrinsèquement hiérarchiques (systèmes de fichiers, arbres d'expression, DOM)Les données sont plates et une liste ou un tableau suffirait : un arbre ne fait qu'ajouter de la surcharge
Vous voulez des opérations ordonnées et pouvez le maintenir équilibré (un BST ou un arbre auto-équilibré)Vous avez besoin d'une recherche par clé en O(1) en moyenne : une table de hachage surpasse tout arbre
Vous devez traiter des données structurées en infixe, préfixe ou postfixeLes nœuds sont insérés en ordre croissant dans un BST non équilibré : il dégénère en une liste O(n)
Les requêtes par plage ou l'itération ordonnée comptent, ce que les tables de hachage ne fournissent pasLa mémoire est limitée : chaque nœud porte deux pointeurs vers ses enfants en plus des données

Code de Binary Tree

Une implémentation propre et exécutable de Binary Tree en Python, JavaScript, Java, C++, C. Choisissez un langage, copiez le code ou ouvrez-le préchargé dans le Playground Coddy.

Code de Binary Tree en Python

Python
1from collections import deque2
3
4class Node:5    def __init__(self, value):6        self.value = value7        self.left = None8        self.right = None9
10
11def insert(root, value):12    # Level-order insert: fill the first empty child slot found13    if root is None:14        return Node(value)15    queue = deque([root])16    while queue:17        node = queue.popleft()18        if node.left is None:19            node.left = Node(value)20            return root21        queue.append(node.left)22        if node.right is None:23            node.right = Node(value)24            return root25        queue.append(node.right)26
27
28def inorder(node):29    if node is None:30        return []31    return inorder(node.left) + [node.value] + inorder(node.right)32
33
34root = None35for value in [1, 2, 3, 4, 5, 6, 7]:36    root = insert(root, value)37
38print("Root:   ", root.value)39print("Inorder:", inorder(root))
Exécutez ce code dans le Playground Python

FAQ sur les arbres binaires

Quelle est la différence entre un arbre binaire et un arbre binaire de recherche ?
Un arbre binaire limite simplement chaque nœud à au plus deux enfants, sans aucun ordre. Un arbre binaire de recherche ajoute la règle selon laquelle tout dans le sous-arbre gauche est plus petit et tout dans le sous-arbre droit est plus grand, ce qui rend la recherche rapide.
Qu'est-ce qu'un parcours infixe ?
Le parcours infixe visite le sous-arbre gauche, puis le nœud, puis le sous-arbre droit, de façon récursive. Pour un arbre binaire de recherche, cela produit les valeurs en ordre croissant, c'est pourquoi c'est le parcours le plus courant à démontrer.
Qu'est-ce qu'un arbre binaire complet ?
Un arbre binaire complet a tous ses niveaux entièrement remplis sauf peut-être le dernier, qui est rempli de gauche à droite. Cette forme permet de stocker l'arbre de manière compacte dans un tableau (sans pointeurs vers les enfants), ce qui est la façon dont les tas binaires sont implémentés.
Quand devrais-je utiliser un arbre binaire plutôt qu'un tableau ou une table de hachage ?
Optez pour un arbre lorsque vos données sont naturellement hiérarchiques ou lorsque vous avez besoin d'opérations ordonnées comme les requêtes par plage et l'itération triée, ce que les tables de hachage ne peuvent pas offrir. Si vous n'avez besoin que d'une recherche rapide par clé sans ordre, l'accès moyen en O(1) d'une table de hachage surpasse un arbre, et pour des données plates un tableau est plus simple et plus favorable au cache.
Quelle est la différence entre la hauteur et la profondeur d'un arbre binaire ?
La profondeur se mesure depuis la racine vers le bas jusqu'à un nœud précis : le nombre d'arêtes sur le chemin de la racine à ce nœud. La hauteur se mesure depuis un nœud vers le bas jusqu'à sa feuille la plus profonde, de sorte que la hauteur de tout l'arbre est la profondeur de son nœud le plus profond. Un arbre à un seul nœud a une hauteur de 0, et son unique nœud a aussi une profondeur de 0.
Pourquoi un arbre binaire non équilibré est-il si peu performant ?
Rechercher, insérer et supprimer dans un arbre binaire de recherche coûtent O(h), où h est la hauteur. Lorsque les clés sont insérées en ordre croissant, l'arbre devient une ligne droite, donc h croît jusqu'à n et chaque opération dégénère en O(n), pas mieux qu'une liste chaînée. Les arbres auto-équilibrés comme les arbres AVL ou rouge-noir maintiennent la hauteur à O(log n) pour éviter cela.
Coddy programming languages illustration

Maîtrisez les algorithmes avec Coddy

COMMENCER