Cours7 Arbres

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 57

ARBRES

Arbres binaires
Représentation des arbres
Fonctions primitives sur les arbres
Parcours d’arbres
Arbres ordonnés
À QUOI SERVENT LES ARBRES ?

¢  Les arbres, comme les listes, permettent de


représenter un nombre variable de données

¢  Le principal avantage des arbres par rapport


aux listes est qu’ils permettent de ranger les
données de telle sorte que les recherches
soient plus efficaces

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


DÉFINITION

¢  Un arbre est soit un nœud, soit un arbre vide


¢  Un nœud a des fils qui sont eux aussi des arbres

¢  Si tous les fils d’un nœud sont vides, alors le


nœud est qualifié de feuille
¢  Les nœuds portent des valeurs, ce sont les
données que l’on veut stocker
¢  Si tous les nœuds de l’arbre ont n fils, alors
l’arbre est dit n-aire

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


EXEMPLE D’ARBRE

6 Racine

4 9

1 8
Feuilles

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


ARBRES BINAIRES

¢  Un arbre binaire est :


—  soit l’arbre vide
—  soit un nœud qui a exactement deux fils
(éventuellement vides)

¢  Pour manipuler les arbres binaires, on a besoin


de primitives
—  d’accès
—  de test
—  de construction
5

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


PRIMITIVES SUR LES ARBRES BINAIRES (1)
¢  Primitives d’accès
—  valeur : retourne la valeur d’un arbre non vide
—  fils-g : retourne le fils de gauche d’un arbre non vide
—  fils-d : retourne le fils de droite d’un arbre non vide

¢  Primitives de test
—  vide? : retourne vrai si un arbre donné est vide
—  arbre=? : retourne vrai si deux arbres donnés sont
égaux

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


PRIMITIVES SUR LES ARBRES BINAIRES (2)

¢  Primitives de construction
—  vide : retourne un arbre vide
—  cons-binaire : crée un arbre avec une valeur donnée et
deux arbres donnés qui seront ses deux uniques fils

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


EXEMPLES D’UTILISATION DES PRIMITIVES

Soit l’arbre a :
6

(valeur a) → 6
(valeur (fils-g a)) → 4
4 9
(valeur (fils-d (fils-g a))) → 8
(vide? a) → #f
(vide? (fils-d a)) → #f
1 8 (vide? (fils-g (fils-d a))) → #t

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


REPRÉSENTATION DES ARBRES BINAIRES

¢  Nous choisissons d’utiliser les listes pour


représenter les arbres
¢  Un arbre vide sera représenté par la liste vide ()
¢  Un nœud sera une liste de 3 éléments
—  le car est sa valeur
—  le cadr son fils gauche
—  le caddr son fils droit

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


EXEMPLE DE REPRÉSENTATION D’UN
ARBRE BINAIRE

(define a '(6 (4 (1 () ()) (8 () ())) (9 () ())))

valeur fils-g fils-d


6

4 9

1 8
10

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


DÉFINITIONS DES PRIMITIVES (1)

¢  valeur : retourne la valeur d’un arbre non vide


(define valeur ; → atome
(lambda (arbre) ; arbre non vide
(car arbre)))

¢  fils-g : retourne le fils de gauche d’un arbre non vide


(define fils-g ; → arbre
(lambda (arbre) ; arbre non vide
(cadr arbre)))

11

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


DÉFINITIONS DES PRIMITIVES (2)

¢  fils-d : retourne le fils de droite d’un arbre non vide


(define fils-d ; → arbre
(lambda (arbre) ; arbre non vide
(caddr arbre)))

¢  vide? : retourne vrai si un arbre donné est vide


(define vide? ; → booléen
(lambda (arbre) ; arbre
(null? arbre)))

12

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


DÉFINITIONS DES PRIMITIVES (3)

¢  arbre=? : retourne vrai si deux arbres donnés sont égaux


(define arbre=? ; → booléen
(lambda (arbre1 arbre2) ; arbres
(equal? arbre1 arbre2)))

¢  vide : retourne un arbre vide


(define vide ; → arbre
(lambda ()
’() ))

13

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


DÉFINITIONS DES PRIMITIVES (4)

¢  cons-binaire : crée un arbre avec une valeur donnée et


deux arbres donnés qui seront ses deux uniques fils
(define cons-binaire ; → arbre
(lambda (val fg fd); val atome, fg et fd arbres
(list val fg fd)))

14

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


EXEMPLES

¢  (define a '(6 (4 (1 () ()) (8 () ())) (9 () ())))

¢  (define b (fils-g a))

¢  b → (4 (1 () ()) (8 () ()))

¢  (cons-binaire 2 b (fils-d a))


→ (2 (4 (1 () ()) (8 () ())) (9 () ()))
15

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


POURQUOI UTILISER DES PRIMITIVES ?

¢  Pourquoi utiliser (vide) au lieu de () et


fils-g au lieu de cadr ?
¢  Si on décide de changer la représentation des
arbres :
—  sans primitives, il faut réécrire toutes les fonctions sur
les arbres
—  avec primitives, il suffit de modifier les primitives

16

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


PARCOURS D’ARBRES

¢  Un arbre contient un ensemble de données


¢  Pour utiliser ces données, il faut parcourir l’arbre
—  en profondeur
—  ou en largeur

17

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


PARCOURS EN LARGEUR / PROFONDEUR

6 6

4 9 4 9

1 8 1 8
Parcours en largeur Parcours en profondeur
18

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


PARCOURS EN PROFONDEUR : PRINCIPE

¢  Parcourir un arbre en profondeur consiste à


passer ses nœuds en revue, en commençant
toujours par le même fils, et en descendant le
plus profondément possible dans l’arbre
¢  Lorsque l’on arrive sur un arbre vide, on remonte
jusqu’au nœud supérieur et on redescend dans
le fils encore inexploré

19

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


3 PARCOURS EN PROFONDEUR

¢  Parcours infixe :
¢  Fils-g Valeur Fils-d
6
¢  → 1 4 8 6 9
¢  Parcours préfixe :
4 9 ¢  Valeur Fils-g Fils-d

¢  → 6 4 1 8 9
¢  Parcours postfixe :
1 8
¢  Fils-g Fils-d Valeur
¢  → 1 8 4 9 6
20

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


POUR ÉCRIRE UNE FONCTION QUI EFFECTUE UN
PARCOURS EN PROFONDEUR

¢  Pour écrire une fonction f, sur un arbre A


—  Si A est vide, on retourne une valeur constante,
généralement l’élément neutre de f
—  Si A n’est pas vide :
¢  on rappelle f sur les deux fils de A, ce qui retourne deux
résultats : Rg et Rd
¢  puis on retourne un résultat qui ne dépend que de Rg, Rd et de

la valeur de la racine de A

21

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


EXEMPLE : SOMME DES VALEURS D’UN ARBRE

(define somme ; → nombre


(lambda (A) ; A arbre de nombres
(if (vide? A)
0
(+ (somme (fils-g A))
(somme (fils-d A))
(valeur A)))))

22

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


(somme A)
(+ (somme (fils-g A) ILLUSTRATION
(+ (somme (fils-g A)
(+ (somme (fils-g A)
0
(somme (fils-d A) 6
0
1)
(somme (fils-d A) 4 9
(+ (somme (fils-g A)
0
(somme (fils-d A)
0 1 8
8)
4)
(somme (fils-d A)
(+ (somme (fils-g A)
0
(somme (fils-d A)
23
0
6)
N. Guin - M. Lefevre - F. Zara 9) Licence Lyon1 - UE LIF3
FONCTIONNEMENT SUR UN EXEMPLE
28

13 9

4 9
0 0
1 8
1 8
0 0 0 0
24

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


MODIFICATION DU CAS D’ARRÊT

(define somme ; → nombre


(lambda (A) ; A arbre de nombres
(if (feuille? A)
(valeur A)
(+ (somme (fils-g A))
(somme (fils-d A))
(valeur A)))))

25

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


PREMIER TEST

28

13 9

4 9
1 8
1 8

26

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


DEUXIÈME TEST
6

4 9
1

Il manque le cas de l’arbre vide

27

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


MORALITÉ

¢  Ilfaut toujours tester les fonctions sur un arbre


dont un nœud n’a qu’un seul fils

¢  Il faut toujours prévoir le cas d’arrêt


correspondant à l’arbre vide

28

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


PARCOURS PARTIELS

¢  Ilest parfois souhaitable d’arrêter le parcours


même si tous les nœuds n’ont pas été passés en
revue
¢  Exemple : produit des valeurs d’un arbre

(define produit ; → nombre


(lambda (A) ; A arbre de nombres
(if (vide? A)
1
(* (produit (fils-g A))
(produit (fils-d A))
(valeur A))))) 29

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


PREMIER TEST

0
On fait des calculs
6 inutiles
0 9

0 9
1 8 1 1
Il faut s’arrêter dès
1 8 qu’on rencontre la
1 1 1 1 valeur 0
30

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


MODIFICATION DE LA FONCTION

(define produit ; → nombre


(lambda (A) ; A arbre de nombres
(cond ((vide? A) 1)
((= 0 (valeur A)) 0)
(else (* (produit (fils-g A))
(produit (fils-d A))
(valeur A))))))

31

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


DEUXIÈME TEST

6
0 9

0 9
1 1

1 8

32

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


MODIFICATION ET CRÉATION D’ARBRES

¢  Exemple : écrire une fonction qui ajoute 1 à tous


les nœuds d’un arbre qui contient des nombres
¢  Il ne s’agit pas d’une modification (ajouter 1),
mais d’une création : écrire une fonction qui
retourne un arbre identique à celui passé en
argument, mais dans lequel on a ajouté 1 à tous
les nœuds

33

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


FONCTION AJOUTE1

(define ajoute1 ; → arbre


(lambda (A) ; A arbre de nombres
(if (vide? A)
A
(cons-binaire (+ 1 (valeur A))
(ajoute1 (fils-g A))
(ajoute1 (fils-d A))))))

34

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


SOMME DES VALEURS DES FILS

6 28

4 9 13 9

1 8 1 8

35

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


PREMIÈRE SOLUTION :
UTILISER LA FONCTION SOMME

(define somme-fils ; → arbre


(lambda (a) ; a arbre de nombres
(if (vide? a)
(vide)
(cons-binaire
(somme a)
(somme-fils (fils-g a))
(somme-fils (fils-d a))))))

36

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


RÉFLEXION SUR CETTE FONCTION

¢  La complexité de cette fonction est beaucoup


trop grande
¢  Il faut utiliser la valeur de la racine du résultat de
l’appel récursif sur les fils : ils contiennent déjà la
somme des valeurs de tous les nœuds de
chacun des fils

37

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


MODIFICATION DE LA FONCTION

(define somme-fils ; → arbre


(lambda (A) ; A arbre de nombres
(if (vide? A)
(vide)
(let ((g (somme-fils (fils-g A)))
(d (somme-fils (fils-d A))))
(cons-binaire
(+ (valeur A) (valeur g) (valeur d))
g
d)))))
38

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


TEST DE LA FONCTION

6 6

4 9 4 9

1 8 1

39

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


CORRECTION DE LA FONCTION

(define somme-fils ; → arbre


(lambda (A) ; A arbre
(if (vide? A))
(vide)
(let ((g (somme-fils (fils-g A)))
(d (somme-fils (fils-d A))))
(cons-binaire
(+ (valeur A)
(if (vide? g) 0 (valeur g))
(if (vide? d) 0 (valeur d)))
g
d))))) 40

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


SOMME DES VALEURS DES PÈRES

6 6

4 9 4+6 = 10 9+6 = 15

1 8 1+10 = 11 8+10 = 18

41

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


CALCUL EN REMONTANT OU EN
DESCENDANT
¢  Dans toutes les fonctions précédemment écrites,
le résultat dépendait des fils
⇒ calcul en remontant
¢  Ici, le résultat dépend du père
⇒ calcul en descendant
⇒ paramètre supplémentaire pour passer le
résultat du père au fils

42

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


FONCTION SOMME-PERE

¢  (define somme-pere ; → arbre


(lambda (A) ; A arbre de nombres
(somme-pere2 A 0)))
¢  (define somme-pere2 ; → arbre
(lambda (A n) ; A arbre de nb, n nombre
(if (vide? A)
(vide)
(let ((v (+ (valeur A) n)))
(cons-binaire
v
(somme-pere2 (fils-g A) v)
(somme-pere2 (fils-d A) v)))))) 43

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


(Somme-pere2 A 0)
v=0+6 ILLUSTRATION
(cons-binaire 6 6
(somme-pere2 (fils-g A) 6) 9
4
v = 6 + 4 = 10
(cons-binaire 10 1 8
(somme-pere2 (fils-g A) 10)
v = 10 + 1 = 11
(cons-binaire 11
(somme-pere2 (fils-g A) 11) (vide)
(somme-pere2 (fils-d A) 11) (vide)
(somme-pere2 (fils-d A) 10)
v = 10 + 18 = 28
(cons-binaire 28
(somme-pere2 (fils-g A) 28) (vide)
(somme-pere2 (fils-d A) 28) (vide)
(somme-pere2 (fils-d A) 6) 44


N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3
ARBRES BINAIRES DE RECHERCHE
(OU ORDONNÉS)
¢  Les valeurs des nœuds doivent pouvoir être ordonnées
¢  En chaque nœud de l’arbre, la valeur du nœud est :
—  supérieure à toutes celles de son fils gauche
—  inférieure à toutes celles de son fils droit

<7 >7

¢  On suppose qu’il n’y a pas deux fois la même valeur dans


un ABR
45

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


EXEMPLES

6 6

4 9 4 9

1 5 1 8

Arbre ordonné Arbre non ordonné


46

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


RECHERCHE D’UN ÉLÉMENT DANS UN
ARBRE BINAIRE QUELCONQUE (1)
¢  On souhaite écrire une fonction qui teste
l’appartenance d’une valeur V à un arbre A

¢  Principe : tant qu’on n’a pas trouvé la valeur V, il


faut comparer V avec toutes les valeurs de
l’arbre A

47

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


RECHERCHE D’UN ÉLÉMENT DANS UN
ARBRE BINAIRE QUELCONQUE (2)
¢  Algorithme :
—  Cas d’arrêt :
¢  Si A est vide Alors Retourne Faux
¢  Si valeur(A)=V Alors Retourne Vrai

—  Appels récursifs :
¢  Chercher V dans fils-gauche(A)
¢  Puis si on n’a toujours pas trouvé V, chercher V dans fils-droit(A)

48

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


EXEMPLE

6 Recherche fructueuse :
Chercher 5
4 9
Cas le pire
Recherche infructueuse :
1 8 Chercher 7

3 5 Complexité au pire :
nombre de nœuds de
l’arbre 49

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


RECHERCHE D’UN ÉLÉMENT DANS UN
ARBRE BINAIRE ORDONNÉ (1)
¢  Principe : utiliser le fait que l’arbre est ordonné
pour choisir dans quelle branche de l’arbre
chercher

50

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


RECHERCHE D’UN ÉLÉMENT DANS UN
ARBRE BINAIRE ORDONNÉ (2)
¢  Algorithme :
—  Cas d’arrêt :
¢  Si A est vide Alors Retourne Faux
¢  Si valeur(A)=V Alors Retourne Vrai

—  Appels récursifs :
¢  Si V>valeur(A) Alors chercher V dans fils-droit(A)
¢  Si V<valeur(A) Alors chercher V dans fils-gauche(A)

51

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


EXEMPLE

6 Recherche fructueuse :
Chercher 5
2 9
Recherche infructueuse :
Chercher 7
1 4
Complexité au pire :
3 5 hauteur de l’arbre

52

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


INSERTION DANS UN ABR

¢  Principe : on insère aux feuilles

7 6 6

4 9 4 9

1 5 1 5 7
53

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


SUPPRESSION DANS UN ABR

¢  Pour supprimer la valeur V dans un ABR


—  Si V est une feuille, alors on supprime la feuille
—  Sinon on remplace la valeur V par la valeur V’ qui lui
est immédiatement inférieure (ou immédiatement
supérieure), de manière à respecter l’ordre, puis on
supprime V’ qui n’a pas de fils droit
—  V’ est le plus grand élément du fils gauche de V (ou le
plus petit élément de son fils droit)

54

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


EXEMPLE

6 6

4 9 4 9

1 5 1

55

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


EXEMPLE

6 6

4 9 3 9

2 5 2 5

1 3 1
56

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3


EXEMPLE 6 6

4 9 3 9

2 5 2 5

1 3 1
2,5

2,5 2,2 2,8

2,2 2,8 57

N. Guin - M. Lefevre - F. Zara Licence Lyon1 - UE LIF3

Vous aimerez peut-être aussi

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy