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
d´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 d´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 :