Jusqu'à présent, nous avons appris à manipuler des structures de données linéaires : listes, dictionnaires, piles, files. Bien que très utiles, ces structures de données ne sont pas adaptées à tous les problèmes, comme la classification ou la recherche des données, pour lesquels il est préférable d'utiliser une structure hiérarchique.
Un arbre est une structure de données hiérarchique constituée de noeuds. Comme les listes, les arbres permettent de représenter un nombre variable de données, mais sont beaucoup plus adaptés à la recherche des données.
Les noeuds sont reliés entre eux par des arêtes. Un noeud peut avoir des enfants, qui sont eux mêmes des autres noeuds. Chaque noeud possède un parent unique, sauf le noeud le plus haut, appelé racine de l'arbre. Les noeuds sans enfants sont les feuilles de l'arbre. Une branche est une suite finie de noeuds consécutifs, de la racine vers une feuille.
Traditionnellement, on représente un arbre "à l'envers", avec la racine tout en haut et les feuilles tout en bas.
L'arbre ci-dessus possède les caractéristiques suivantes :
Chaque noeud possède une hauteur ou profondeur, définie comme le nombre d'arêtes entre ce noeud et la racine. Par exemple, la hauteur du noeud B est égale à 1, tandis que la hauteur du noeud H est égale à 3.
On définit alors la hauteur de l'arbre comme la plus grande des hauteurs des noeuds. Dans l'exemple ci-dessus, on a donc un arbre de hauteur 3.
Enfin, on définit l'arité d'un arbre comme le nombre maximal d'enfants qu'un noeud peut avoir. Dans l'exemple, c'est le noeud B qui possèdent le plus d'enfants : 3. L'arité de l'arbre est alors égale à 3.
Parmi les exemples rencontrés dans la vie courante, on peut notamment citer les arborescences de fichiers :
ou encore l'arbre de la vie :
Nous allons maitenant considérer des arbres d'arité 2, que l'on appelle arbres binaires. Ces arbres sont constitués de noeuds possédant 0,1 ou 2 enfants. À partir d'un noeud, on définit deux sous-arbres disjoints : le sous-arbre gauche (abrégé SAG) et le sous-arbre droit (abrégé SAD).
Sur un arbre binaire $\alpha$, on peut "prendre des mesures" comme :
Pour l'exemple, reprenons l'arbre binaire précédent, que l'on appelera $\alpha$ :
Une expression arithmétique peut être représentée sous la forme d'un arbre binaire en exprimant une opération dans les noeuds internes et les nombres dans les feuilles. Par exemple, l'expression $7 + (4+5) \times 8$ se représente avec l'arbre ci-dessous :
Le calcul est : $$ (1 + 4) / ((3 + 2) \times (3 - 1)) $$ Le résultat est $\dfrac12 = 0,5$.
Voici une réponse possible (il existe plusieurs solutions) :
Terminons par une remarque : chaque noeud d'un arbre (binaire ou non) est repéré de manière unique par son identifiant, généralement une lettre ou un chiffre. Il est également commun de donner une étiquette à un noeud, qui représente sa valeur. Ainsi, un noeud est comme une variable, représenté par un nom (son identifiant) et associé à une valeur (son étiquette).
Ainsi, deux noeuds peuvent avoir la même étiquette, mais jamais le même identifiant.
Un arbre binaire de recherche est un arbre pour lequel l'étiquette d'un noeud est appelée clé. L'arbre binaire de recherche satisfait aux critères suivants :
Ceci est un arbre binaire de recherche.
Ceci n'est pas un arbre binaire de recherche : 9 est dans le sous-arbre gauche de 7, et 11 est dans le sous-arbre droit de 12.
Un arbre binaire de recherche est dit équilibré si la différence de longueur entre la branche la plus longue et la branche la moins longue est au plus égale à 1.
Arbre de recherche non équilibré : la plus longue branche (50-23-19-17-14-12-9) est de longueur 6, et la plus petite (50-72-76) est de longueur 3
Le même arbre de recherche, mais équilibré : la plus longue branche (50-17-12-9) est de longueur 4, et la plus petite (50-72-76) est de longueur 3
Nous verrons en Algorithmique que la recherche d'un élément est bien plus rapide sur un arbre binaire de recherche équilibré.
Il existe différentes manières de représenter un arbre binaire. Voici les principales.
Seules les étiquettes sont représentées dans l'arbre
Une autre façon de représenter un arbre binaire est un tableau à 1 dimension !
Le tableau, noté $T$, est ordonné de sorte que la case $T_i$ représente l'étiquette du noeud $i$.
Plus généralement, les enfants du noeud $i$ ont pour étiquettes $T_{2i}$ et $T_{2i+1}$.
Arbre et tableau contigu correspondant
On peut définir un arbre de manière récursive, les sous-arbres d'un noeud étant encore des arbres !
Formellement, on considère les trois opérations de base suivantes :
Ces trois opérations élémentaires permettent de représenter n'importe quel arbre.
# Exemple d'implémentation
A = FEUILLE(5)
B = FEUILLE(4)
C = ARBRE(3, B, A)
D = FEUILLE(2)
E = ARBRE(1, D, C)
Ci-dessous, le détail de chaque arbre ainsi créé :
A = FEUILLE(20)
B = ARBRE(15, A, ARBRE_VIDE())
C = FEUILLE(3)
D = ARBRE(8,C,B)
E = FEUILLE(4)
F = ARBRE(5, ARBRE_VIDE(), E)
G = ARBRE(10, D, F)