| structure | recherche | insertion |
| tableau | O(n) | O(1) |
| liste | O(n) | O(1) |
| table ordonnée | O(n) | |
| arbres de recherche |
|
|
* : en moyenne.
Les arbres binaires de recherche fournissent une structure de données dynamique de relativement basse complexité.
Arbres binaires satisfaisant la propriété suivante: Si v est l'étiquette d'un noeud, on a w<v pour tout noeud du sous-arbre gauche et v<w pour tout noeud du sous-arbre droit.
Propriété caractéristique: la suite des étiquettes des noeuds dans l'ordre interne est croissante.
Opérations de base: recherche,insertion, suppression.
La recherche est une généralisation de la recherche dichotomique.
On représente les arbres avec des triplets.
class Arbre{
int contenu;
Arbre filsG;
Arbre filsD;
Arbre(int v, Arbre a, Arbre b) {
contenu = v;
filsG=a;
filsD= b;
}
}
La recherche est une généralisation de la recherche dichotomique.
static Arbre Recherche (int v, Arbre a) {
if (a == null || v == a.contenu)
return a;
else
if (v < a.contenu)
return Recherche (v, a.filsG);
else
return Recherche (v, a.filsD);
}
static Arbre ajouter(int v, Arbre a) {
if (a == null)
return new Arbre(v,null,null);
else if (v <= a.contenu)
return
new Arbre( a.contenu,
ajouter (v, a.filsG), a.filsD);
else
return
new Arbre( a.contenu,
a.filsG, ajouter (v, a.filsD));
}
La suppression d'un élément nécessite une précaution : il ne faut pas créer un ``trou''. On choisit de remplacer le noeud à supprimer par le plus grand des descendants de son fils gauche (ou par son fils droit s'il n'a pas de fils gauche).
La première fonction supprime le plus grand élément d'un arbre de recherche et rend sa valeur:
static int max(Arbre a) {
int x;
if (a.filsD == null){
x = a.contenu;
a = a.filsG;
return x;
}
else
return max(a.filsD);
}
static Arbre supprimer(int v, Arbre a) {
if (a != null) {
if (v < a.contenu)
a.filsG = supprimer(v, a.filsG);
else if (v > a.contenu)
a.filsD = supprimer(v, a.filsD);
else if (a.filsG == null)
a = a.filsD;
else
a.contenu = max(a.filsG);
}
return a;
}
Leur complexité est donc O(h)où h est la hauteur de l'arbre.
La complexité
moyenne est la hauteur moyenne h(n) d'un noeud. Pour montrer
que
, on procède en deux étapes.
Supposons que l'arbre est obtenu par n insertions
successives de n éléments arrivant dans un ordre
aléatoire. On a, en raisonnant sur le premier arrivé i
On écrit
On peut obtenir une complexité logarithmique non pas en moyenne mais dans le pire des cas en utilisant des structures plus compliquées comme :
On peut vérifier que la hauteur h d'un arbre AVL ayant N noeuds
vérifie
La rotation droite est définie par