a = b*-c + b*-c;se traduit par l'arbre
2. Les fichiers enregistrés sur une machine sont en général organisés en arbre. Les noeuds internes sont les répertoires (ou dossiers) et les feuilles sont les fichiers.
Un arbre est donné par
Si m et n ont le même père, on dit qu'ils sont frères.
Si n est un ancêtre de m, on dit aussi que m est un descendant de n.
Une feuille est un noeud qui n'a pas de fils. Les autres sont des noeuds internes.
Un arbre est soit réduit à sa racine, soit constitué d'un noeud (sa racine) et d'un ensemble d'arbres. Les racines de ces arbres sont les fils de la racine.
Symboliquement on peut écrire:
Un arbre planaire est un arbre sur lequel on a défini un ordre sur l'ensemble des fils de chaque noeud.
Un arbre binaire est un arbre dans lequel chaque noeud a au plus deux fils désignés comme fils gauche et droit.
Un arbre binaire complet est un arbre binaire dont tout noeud a 0 fils ou 2 fils.
Si un arbre binaire complet a n feuilles, il a 2n-1 noeuds.
| 1 | 2 | 3 | 4 |
| 4 | 4 | 2 | 0 |
class ListeFils {
int contenu;
ListeFils suite;
}
class Arbre {
ListeFils[] table;
}
class Arbre {
int[] FilsG, FilsD;
}
ou des listes
class Arbre {
int contenu;
Arbre filsG;
Arbre filsD;
}
class Arbre {
int contenu;
Arbre filsG;
Arbre frereD;
}
C'est la même représentation que les arbres binaires.
On définit plusieurs ordres de parcours:
fg[ ], fd[ ] d'entiers.
static void Parcours(int r) {
int n;
System.out.println(r);
n= fg[r];
if (n != VIDE)
Parcours(n);
n= fd[r];
if (n != VIDE)
Parcours(n);
}
En effet
Arbres binaires représentés dans un tableau
avec la convention que les sommets sont rangés dans l'ordre
militaire (de gauche à droite, niveau par niveau). L'arbre:
est représenté par le tableau:
| 0 | 1 | 2 | 3 |
| 12 | 7 | 5 | 3 |
Propriété essentielle: les fils du noeud i sont 2i+1 et 2i+2.
static void ajouter (int v) {
int i;
n = n+1;
i = n;
while (i> 0 && a[(i-1) / 2] <= v ) {
a[i] = a[(i-1) / 2];
i = (i-1) / 2;
}
a[i] = v;
}
La suppression du maximum se fait par tamisage du dernier élément mis à la place de la racine:
static void supprimer() {
int i, j, v;
a[0] = a[n]; --n;
i= 0; v = a[0];
while (2*i+1 < n ) {
j = 2*i+1;
if (j<n && a[j+1] > a[j])
++j;
if (v > a[j]) break;
a[i] = a[j]; i = j;
}
a[i] = v;
}