Licence 3, semestre 5, 2010–2011 Programmation Fonctionnelle TD8 1 Arbres binaires On s’intéresse dans cet exercice aux différents parcours d’un arbre binaire. On suppose que ces arbres sont définis à l’aide du type suivant : type ’a arbre = F of ’a | N of ’a * ’a arbre * ’a arbre Question 1. Écrire une fonction elements : ’a arbre -> ’a list qui renvoie la liste des éléments (aux feuilles ou aux nœuds) d’un arbre. Question 2. Écrire une fonction récursive feuilles : ’a arbre -> int qui renvoie le nombre de feuilles dans un arbre. Question 3. Écrire une fonction récursive noeuds : ’a arbre -> int qui renvoie le nombre de nœuds dans un arbre. Question 4. Écrire une fonction récursive profondeur : ’a arbre -> int qui renvoie la hauteur d’un arbre. Question 5. En supposant que le type ’a arbre soit abstrait (ou privé), définir un itérateur fold suffisamment générique pour permettre de définir les quatre fonctions précédentes. 2 Arbres binaires de recherche On suppose maintenant que les arbres de type ’a arbre ont la propriété des arbres de recherche (cf. cours). type ’a rech = Vide | Noeud of ’a rech * ’a * ’a rech Question 6. Écrire une fonction inclus : ’a rech -> ’a rech -> bool telle que inclus a b détermine si les éléments de l’arbre a sont dans l’arbre b. Question 7. Écrire une fonction decoupe : ’a -> ’a rech -> ’a rech * ’a rech qui partage un arbre de recherche selon un élément x (supposé appartenir à l’arbre) en deux sous-arbres de recherche l et r tels que tous les éléments de l sont plus petits que x et tous les éléments de r plus grands. Question 8. En utilisant la fonction précédente, écrire une fonction union : ’a rech -> ’a rech -> ’a rech qui réalise l’union de deux arbres de recherche. 1