Les arbres (n

Transcription

Les arbres (n
Les arbres (n-aires)
„
permettent le stockage de données ayant
une structure hiérarchique
‹ bases de données hiérarchiques,
‹ arborescences, systèmes de fichiers (Unix, Dos,
Windows x.x, Windows 95 avec Fat)
font sauter les limites des arbres binaires
„ ont des variantes intéressantes : B-arbres, ...
„
jeudi 21 octobre 2004
Arbres n-aires
1
Dans un arbre n-aire
Chaque sommet peut avoir 0 à n
successeurs («fils»)
„ S’il n’a pas de successeur, c’est une
«feuille»
„ Chaque sommet (excepté la «racine») a un
prédécesseur («père»)
„
jeudi 21 octobre 2004
Arbres n-aires
2
Fonctionnalités
Ajout d’une nouvelle information dans un
nouveau sommet, fils d’un sommet donné
„ Recherche d’une information à partir d’une
clef donnée (plusieurs modes de parcours au
choix)
„ toutes les fonctions habituelles sur les
structures de données : sauvegarde,
restauration, ...
„
jeudi 21 octobre 2004
Arbres n-aires
3
Les implémentations
„
lorsque n est fixe (connu d’avance)
‹ en généralisant les arbres binaires
) chaque
sommet comporte un tableau de n pointeurs
vers ses successeurs, ou un tableau de n sous-arbres
(point de vue récursif)
‹ en généralisant les ABR
) chaque
sommet comporte n-1 valeurs v1, ..., vn-1et n
pointeurs p1, ..., pn.. Pi pointe sur le sous-arbre dont
les valeurs sont comprises entre vi-1 et vi
jeudi 21 octobre 2004
Arbres n-aires
4
Les implémentations
„
Lorsque n n'est pas fixe, ou pour éviter les
pertes de place
‹ chaque sommet comporte un pointeur vers son
premier fils et vers son frère
„
Dans tous les cas, il est possible d'ajouter un
pointeur vers le sommet père, utile dans les
algorithmes qui ne partent pas de la racine.
jeudi 21 octobre 2004
Arbres n-aires
5
Avec n non fixe
Implémentation
Arbre voulu
jeudi 21 octobre 2004
Arbres n-aires
6
Une classe de base possible
#include "objet.h"
class Arbre{
protected :
Objet valeur;
Arbre * filsaine;
Arbre * frere;
Arbre * pere;
private :
Arbre (const Arbre &);
public :
Arbre () {
valeur = objetVide();
filsaine = frere = pere = NULL;}
virtual ~Arbre() {
if (filsaine) delete filsaine;
if (frere)
delete frere;
}
virtual const Objet & recherche(const Clef &) const
= 0;
};
méthode virtuelle pure
jeudi 21 octobre 2004
Arbres n-aires
7
Pour rechercher...
#include "arbre.h"
class RechercheArbre : public Arbre {
public :
const Objet & recherche (const Clef &) const;
};
const Objet &
RechercheArbre::recherche (const Clef & laClef) const{
if (valeur == objetVide()) return objetVide();
if (valeur.donneClef() == laClef) return valeur;
const Objet & ref = frere -> recherche(laClef);
if (! ref.estVide()) return ref;
return (*filsaine).recherche(laClef);
}
jeudi 21 octobre 2004
Arbres n-aires
8