Trois ordres selon le moment où l'on traite la racine :
Parcours
Ordre
Sur l'exemple
Préfixe
R → G → D
4 2 1 3 6 5 7
Infixe
G → R → D
1 2 3 4 5 6 7
Postfixe
G → D → R
1 3 2 5 7 6 4
definfixe(a):
if a isNone: return []
return infixe(a[1]) + [a[0]] + infixe(a[2])
6 / 12
Parcours en largeurBFS
Niveau par niveau, de gauche à droite, à l'aide d'une file (FIFO).
from collections import deque
deflargeur(a):
if a isNone: return []
file, ordre = deque([a]), []
while file:
n = file.popleft()
ordre.append(n[0])
if n[1]: file.append(n[1])
if n[2]: file.append(n[2])
return ordre
Profondeur → pile (récursion) | largeur → file.
7 / 12
Arbre binaire de rechercheABR
En tout nœud : gauche < nœud < droite.
L'invariant d'ordre permet une recherche dichotomique en $O(h)$.
defrecherche(a, x):
if a isNone: returnFalseif x == a[0]: returnTrueif x < a[0]: return recherche(a[1], x)
return recherche(a[2], x)
8 / 12
Insertion dans un ABRABR
definserer(a, x):
if a isNone: return [x, None, None]
if x < a[0]: a[1] = inserer(a[1], x)
elif x > a[0]: a[2] = inserer(a[2], x)
return a
Insérer puis parcourir en infixe $\Rightarrow$ liste triée (tri par arbre).
Pire cas (valeurs déjà triées) : arbre filiforme, $h = n-1$, recherche en $O(n)$.
9 / 12
Le tas (heap)VARIANTE
Arbre binaire complet + propriété de tas. Tas-max : parent $\ge$ fils.
Rangé dans une liste : fils de $i$ en $2i{+}1$ et $2i{+}2$, père en $\lfloor (i-1)/2 \rfloor$.
definserer_tas(t, x):
t.append(x); i = len(t) - 1
while i > 0 and t[(i-1)//2] < t[i]:
p = (i-1)//2
t[i], t[p] = t[p], t[i]; i = p
return t
Support des files de priorité : insertion/extraction du max en $O(\log n)$.
10 / 12
Complexités à retenirBILAN
Opération
Coût
Parcours (DFS / BFS)
$O(n)$
Hauteur, nb de nœuds
$O(n)$
Recherche / insertion ABR (équilibré)
$O(\log n)$
Recherche / insertion ABR (pire cas)
$O(n)$
Insertion / extraction-max tas
$O(\log n)$
11 / 12
À retenirSYNTHÈSE
Définition récursive : vide ou racine + 2 sous-arbres.
Parcours profondeur (préfixe/infixe/postfixe) et largeur.