Feuille2: Arbres binaires de recherche CPP 2A, Semestre 2 – 2016-2017 Dans cette séance, on manipule une structure de données, appelée arbre binaire, qui permet ici de représenter des suites d’entiers. Définition 1 Un arbre binaire d’entiers est: • soit le uplet vide () ; • soit un triplet (l,x,r) où x est un entier et où l et r sont eux-même deux arbres binaires d’entiers. Voir l’exemple de la figure 1. 6 t = ( ((() , 1 , ()) , 2 , (() , 4 , ())) , 6, (() , 8 , (() , 9 , ())) ) 8 2 1 ∅ ∅ 4 ∅ ∅ ∅ 9 ∅ ∅ Figure 1: Un arbre binaire t en Python et sa représentation graphique On programme des traitements sur les arbres par récursivité sur la structure. Par exemple, la fonction sumall ci-contre calcule la somme des entiers dans l’arbre (e.g. 30 pour l’arbre de la figure 1). def sumall ( t ): if t == (): return 0 (l , x , r ) = t return sumall ( l )+ x + sumall ( r ) Exercice 1 Pour chacun des traitements ci-dessous, écrire une fonction Python qui l’effectue en passant au plus une fois par nœud : 1. calcul du nombre d’entiers dans l’arbre (e.g. 6 pour l’arbre de la figure 1) ; 2. calcul de la hauteur de l’arbre, c-à-d. le nombre maximum d’entiers sur une branche de l’arbre (e.g. 3 pour l’arbre de la figure 1) ; 3. calcul de l’entier maximum dans l’arbre sous la précondition que l’arbre est non vide ; 4. affichage de la suite des entiers qui ont deux fils vides (e.g. on veut obtenir 1 4 9 pour l’arbre de la figure 1). 1 On contraint maintenant la structure de données afin de ne représenter que des ensembles d’entiers strictement ordonnés. C’est la notion d’arbre binaire de recherche, ou Binary Search Tree (BST) en anglais. Définition 2 Un arbre binaire de recherche ou BST est: • soit l’arbre vide () ; • soit un arbre (l,x,r) où l et r sont eux-même deux BST et où x est strictement supérieur (resp. strictement inférieur) aux entiers présents dans l (resp. dans r). L’arbre de la figure 1 satisfait cette propriété. Par contre, si on échange deux entiers distincts de cet arbre, l’arbre obtenu ne satisfait pas la propriété. Exercice 2 Programmer les traitements suivants sur les BSTs : 1. affichage des entiers du BST par ordre décroissant (en un seul parcours de l’arbre) ; 2. calcul de l’entier maximum du BST non vide (avec un nombre d’opérations au plus proportionnel à la hauteur de l’arbre) ; 3. test si un entier donné apparaît dans le BST (même condition de coût que précédemment) ; 4. étant donné un entier x, construction d’un BST qui réalise l’union d’un BST et du singleton composé de x : l’élément x sera éventuellement une feuille du nouvel arbre (même condition de coût que précédemment) ; simuler l’exécution de votre fonction en insérant successivement les entiers suivants à partir de l’arbre vide : 6, 3, 9, 12, 2, 11 ; idem avec : 1, 2, 4, 6, 8, 9 ; 5. étant donné un tableau d’entiers triés par ordre strictement croissant, construction d’un BST correspondant à son arbre de recherche dichotomique (en un seul parcours du tableau) ; 6. pour un BST t non vide, calcul d’un couple (tm, m) où m est l’entier maximum de t et tm est un BST qui représente t privé de m (nombre d’opérations au plus proportionnel à la hauteur de l’arbre) ; 7. calcul d’un BST qui réalise la suppression d’un élément (même condition de coût que précédemment) en utilisant la question précédente. 2