Université Paris 13 Licence Info 2ème année - SPI Institut Galilée Année 2015-2016 Structures de données élémentaires TD 5 18 Décembre 2015 Exercice 1 Pour résoudre les exercices qui suivent, on utilise des l'aide des opérations suivantes: arbres binaires qu'on manipule uniquement à arbreVide () ⇒ crée un arbre binaire vide; I x ← racine (A) ⇒ permet de stocker dans x l'élément contenu dans le n÷ud racine de l'arbre A; I A0 ← gauche (A) ⇒ aecte le ls gauche de A à A0 I A0 ← droit(A) ⇒ aecte le ls droit de A à A0 I A ← construire (x, A1 , A2 ) ⇒ construit l'arbre A ayant racine x, ls gauche A1 et ls droit A2 IA ← On dispose aussi du prédicat unaire estVide (A) dont la valeur est vrai si son argument A est un arbre vide, faux sinon. 1) Considérons l'algorithme récursif AlgoTD05.1 en gure 1. Donner le tableau de simulation de l'algorithme algoAppelant qui s'en sert. Que fait l'algorithme AlgoTD05.1? 2) Considérons l'algorithme récursif AlgoTD05.2 en gure 1. Donner le tableau de simulation lorsque A est l'arbre binaire (a) suivant. Que fait cet algorithme? 8 / \ 3 4 / \ \ 2 7 12 / 9 (a) / [*] [+] \ [:] / \ / \ 8 [-] 6 [+] / \ / \ 7 4 3 2 (b) 3) Considérons l'algorithme récursif AlgoTD05.3 en gure 1. Donner le tableau de simulation lorsque A est l'arbre binaire (a) de la question précédente. Que fait cet algorithme? Exercice 2 Les arbres binaires peuvent être utilisés pour mémoriser des expressions arithmétiques. Pour ce faire, les n÷uds intérmediaires doivent représenter des opérations, et les feuilles des nombres entiers. L'arbre binaire (b) précédent en est un exemple. Écrire un algorithme CalculArithmétique qui prend comme argument un tel arbre et renvoie le résultat de l'expression. Vous pourrez vous servir de la fonction estFeuille() qui renvoie vrai si un arbre est une feuille, faux sinon. Une telle fonction est-elle susante pour dénir le cas base de votre algorithme? Pourquoi? algoAppelant() declare A: arbre binaire d'entiers; 1 A ← arbreVide () 2 AlgoTD05.1(A, 8) 3 AlgoTD05.1(A, 2) 4 AlgoTD05.1(A, 9) 5 AlgoTD05.1(A, 5) AlgoTD05.1(A, x) argtype A: arbre binaire d'entiers; x: entier; declare A0, A00: arbre binaire d'entiers; y : entier; 1 if(estVide (A)) 2 A0 ← arbreVide (); A00 ← arbreVide (); 3 A ← construire (x, A0, A00 ) 4 else 5 y ← racine (A) 6 if(x ≤ y ) 7 A0 ← gauche (A) 8 else 9 A0 ← droit(A) 10 endif 11 AlgoTD05.1(A0,x) 12 endif AlgoTD05.2(A) argtype A: arbre binaire d'entiers; returns entier; declare A0, A00: arbre binaire d'entiers; y1 , y2 : entier; 1 if(estVide (A)) 2 return 0 3 else 4 A0 ← gauche (A); y1 ← AlgoTD05.2(A0 ) A00 ← droit(A) y2 ← AlgoTD05.2(A00 ) 5 6 return 1+ max (y1 , y2 ) 7 endif AlgoTD05.3(A) argtype A: arbre binaire d'entiers; returns entier; declare A0, A00: arbre binaire d'entiers; y , y0, y00: entier; 1 if(estVide (A)) 2 return 0 3 endif 4 y ← racine (A) 5 A0 ← gauche (A); y0 ← AlgoTD05.3(A0 ); y = y+y0 A00 ← droit(A); y00 ← AlgoTD05.3(A00 ); y = y+y00 6 7 return y Figure 1: Algorithmes pour l'exercice 1. estFeuille(A) argtype A: arbre binaire returns booléen; 1 2 3 4 5 d'entiers; if(estVide (A)) return faux else return estVide (gauche (A)) && endif estVide (droit(A)) Figure 2: L'algorithme estFeuille() pour l'exercice 2.