Académique Documents
Professionnel Documents
Culture Documents
Arbres Binaires
Noaman Fakhir
1 Arbres binaires
1.1 Definitions
En mathematique: Un arbre est un cas special de graphe acyclique oriente, ou tous les noeuds
sauf la racine ont un unique parent
En informatique: C’est une structure de données récursive utilisée pour représenter ce type
de graphes.
Exemples
• [2, [], []]
• [4, [2, [], []], [8, [1, [], []], []] ]
• [7, [3, [1, [], []], [2, [], []]], [5, [4, [], []], []] ]
1.4 Implementation
1 def cree_arbre():
2 return []
3 def arbre(R, Fg, Fd):
4 return [R, Fg, Fd]
5 def est_vide(A):
6 return A == []
7 def fils_g(A):
8 if est_vide(A): return None
9 return A[1]
10 def fils_d(A):
11 if est_vide(A): return None
12 return A[2]
13 def racine(A):
14 if est_vide(A): return None
15 return A[0]
16 def est_arbre(A):
17 return est_vide(A) or (isinstance(A, list) and len(A) ==3 and
est_arbre(fils_g(A)) and est_arbre(fils_d(A))
18 def est_feuille(A):
19 return not est_vide(A) and est_vide(fils_g(A)) and est_vide(fils_d(A))
1.5 Parcours
On peut parcourir l’arbre en privilegiant la largeur, ou la profondeur.
Prefix :
On parcourt l’arbre recursivement suivant l’ordre : 𝑉𝑟 , 𝐹𝑔 , 𝐹𝑑
Infix :
On parcourt l’arbre recursivement suivant l’ordre : 𝐹𝑔 , 𝑉𝑟 , 𝐹𝑑
Postfix :
On parcourt l’arbre recursivement suivant l’ordre : 𝐹𝑔 , 𝐹𝑑 , 𝑉𝑟
Implementation
1 def parcours_prefixe(A):
2 if est_vide(A) :
3 return []
4 return [racine(A)] + parcours_prefixe(fils_g(A)) + \
5 parcours_prefixe(fils_d(A))
6 def parcours_infixe(A):
7 if est_vide(A) :
8 return []
9 return parcours_infixe(fils_g(A)) + [racine(A)] + \
10 parcours_infixe(fils_d(A))
11 def parcours_postfixe(A):
12 if est_vide(A) :
13 return []
14 return parcours_postfixe(fils_g(A)) + parcours_postfixe(fils_d(A)) + \
15 [racine(A)]
16
17 def BFS(A):
18 F = [A]
19 while F!=[]:
20 x = F.pop(0)
21
22 # Traitement sur x
23 print(racine(x))
24
25 # Ajout des fils dans la file
26 if not est_vide(fils_g(A)):
27 F.append(fils_g(x))
28 if not est_vide(fils_d(A)):
29 F.append(fils_d(x))
Figure 3: Un ABR
On peut obtenir les etiquettes d’un ABR en ordre croissant en faisant un parcours infixe.
2.1 Implementation
1 def min_abr(ABR):
2 current = ABR
3 while not est_vide(fils_g(current)):
4 current = fils_g(current)
5 return racine(current)
6 def max_abr(ABR):
7 current = ABR
8 while not est_vide(fils_d(current)):
9 current = fils_d(current)
10 return racine(current)
11 def insert(ABR, e):
12 if est_vide(ABR):
13 ABR = [e, [], []]
14 elif e <= racine(ABR) :
15 insert(fils_g(ABR), e)
16 else :
17 insert(fils_d(ABR), e)
18
19 def search(ABR, e):
20 if est_vide(ABR) :
21 return False
22 if racine(ABR) == e:
23 return True
24 if e < racine(ABR) :
25 return search(fils_g(ABR), e)
26 if e > racine(ABR) :
27 return search(fils_d(ABR), e)
28
29 def predecessor(ABR, e):
30 if est_vide(fils_g(ABR)) :
31 return None
32 return max_abr(fils_g(ABR))
33 def successor(ABR, e):
34 if est_vide(fils_d(ABR)) :
35 return None
36 return min_abr(fils_d(ABR))
37 def remove(ABR, e):
38 # ...
3 Tas
Un Tas T est un arbre binaire qui verifie les conditions suivantes :
• Il est parfait, c’est a dire tous les niveaux sauf le dernier doivent être totalement remplis et
le dernier niveau est rempli de gauche à droite.
• L’etiquette de chaque noeud est superieure ou egale (resp. inferieure ou egale) aux etiquettes
de ses fils, on parle de tas max (resp. tas min)
Figure 4: Un tas
3.1 Implementation
Le tas etant un arbre binaire parfait, on peut l’implementer en utilisant une seule liste, ou on
met la racine a l’indice 0, et pour chaque noeud i on met les fils gauche et droit aux position
2*i+1 et 2*i+2 .
1 def cree_tas():
2 return []
3 def insert(T, e):
4 # ...
5 def enleve_racine(T):
6 # ...
1 def tri_par_tas(L):
2 # ...