Programmation Fonctionnelle Avanc´ee Master 1
TP 2
Mehdi Dogguy
On appelle arbre AVL (Adelson-Velskii et Landis) un arbre binaire de re-
cherche globalement ´equilibr´e, i.e. la diff´erence entre la hauteur du sous-arbre
gauche et droite est au plus ´egale `a 1.
En Haskell, une structure d’arbre dont les ´el´ements sont de type apeut ˆetre
efinie de la mani`ere suivante :
data Tree a =
Empty | Node a (Tree a ) (Tree a ) der iving Show
Exercice 1 : Un arbre binaire de recherche
Impl´ementez les fonctions suivantes :
1. empty :: Tree a -> Bool qui renvoie vrai quand l’arbre donn´e en argu-
ment est vide, et faux sinon.
2. depth :: Tree a -> Int qui calcule la hauteur d’un arbre.
3. search :: Ord a => Tree a -> a -> Bool qui renvoie vrai quand
l’´el´ement de type apass´e en argument apparaˆıt dans l’arbre.
() Gardez en tˆete que tous les ´el´ement dans le sous-arbre gauche sont
inf´erieurs `a la racine, et ceux du sous-arbre droit sont sup´erieurs.
4. path :: Ord a => Tree a -> a -> [a] qui renvoie le chemin `a suivre
depuis la racine pour trouver l’´el´ement recherch´e.
5. insert :: Ord a => Tree a -> a -> Tree a qui ins`ere un nouvel
´el´ement dans l’arbre, et qui ne fait rien si l’´el´ement y est d´ej`a.
Exercice 2 : Un arbre AVL
Notez que la fonction d’insertion d´efinie dans l’exercice pr´ec´edent ne
pr´eserve pas l’´equilibrage d’un arbre. Pour pouvoir fournir une impl´ementation
d’ins´ertion correcte pour les arbres AVL, il est utile de efinir quelques rotations
d’arbre.
1. Impl´ementez delta :: Tree a -> Tree a -> Int qui calcule la
diff´erence entre la hauteur des deux arbres pass´es en arguments.
2. Impl´ementez le pr´edicat balanced :: Tree a -> Bool qui renvoit vrai
quand l’arbre donn´e en argument est ´equilibr´e, et faux sinon.
Il existe deux rotations simples : la rotation gauche et la rotation droite. On
effectue une rotation gauche quand le sous-arbre gauche est plus haut (i.e. le
delta est ´egal `a 2) que le sous-arbre droit. Ansi, la transformation effectu´ee
peut ˆetre repr´esent´ee par la figure suivante :
A
B
BGBD
C
se transforme en B
BGA
BDC
La rotation droite est l’op´eration inverse (et est d´efinie de fa¸con sym´etrique).
2. efinissez la fonction balanceL :: Tree a -> Tree a qui effectue la ro-
tation gauche.
3. efinissez la fonction balanceR :: Tree a -> Tree a qui effectue la ro-
tation droite.
Il existe les double-rotations gauche-droite et droite-gauche. La transforma-
tion effectu´ee par une rotation gauche-droite est repr´esent´ee ci-dessous.
A
B
BGBD
DGDD
C
se transforme en BD
B
BGDG
A
DDC
4. efinissez la fonction balanceLR :: Tree a -> Tree a qui effectue la
rotation gauche-droite.
5. eduisez la fonction balanceRL :: Tree a -> Tree a qui effectue la ro-
tation droite-gauche.
En utilisant ces rotations, impl´ementez les fonctions suivantes :
6. insert :: Ord a => Tree a -> a -> Tree a qui ins`ere un ´el´ement de
type adans l’arbre, tout en pr´eservant l’´equilibrage. L’algorithme est assez
simple : Suivant la valeur de l’´el´ement e`a ins´erer et celle de la racine, on
sait o`u ins´erer e.
Consid´erons l’arbre Tree r g d o`u e<ret g’ = insert g e. Si g’ est
plus haut que d(i.e. delta g’ d >2), alors un ´equilibrage est n´ecessaire :
Si eest plus grand que la racine de g, alors on effectue une rotation gauche
et sinon une rotation gauche-droite. L’autre cas (i.e. insertion `a droite)
est sym´etrique.
7. load :: Ord a => Tree a -> [a] -> Tree a qui construit un arbre `a
partir d’une liste d’´el´ements.
8. eduisez une mani`ere de trier une liste d’´el´ements et impl´ementez la fonc-
tion sort :: Ord a => [a] -> [a]
1 / 2 100%