TD 5 : Introduction aux arbres




Les méthodes de tous les exercices doivent être écrites dans les classes fournies en annexe (télécharger ces classes) .



EXERCICE 1

On désire implémenter les mesures qui s'appliquent aux arbres binaires étudiés en cours.

Ecrivez les méthodes taille, hauteur, bassesse et feuilles de la classe ArbreBinaire telles que A.taille(), A.hauteur(), A.bassesse() et A.feuilles() retournent respectivement la taille, la hauteur, la bassesse et le nombre de feuilles de l'arbre A. Identifiez le type de parcours utilisé par chacune de ces méthodes.

Aucune difficulté.


EXERCICE 2

On appelle base d'un arbre binaire non vide le nombre de noeuds de profondeur hh est la hauteur de l'arbre. La largeur de l'arbre vide est 0.

Après avoir écrit la méthode auxiliaire appropriée et en utilisant la méthode hauteur définie précédemment, écrivez la méthode base de la classe ArbreBinaire telles que A.base() retourne la base de l'arbre A.

Plus généralement, on peut chercher le nombre de noeuds de profondeur p.


EXERCICE 3

On représente la généalogie d'un individu par un ArbreBinaire dont la racine est l'individu (par exemple, son nom), le sous-arbre gauche étant la généalogie de son père (vide si père inconnu), et le sous-arbre droit étant la généalogie de sa mère (vide si mère inconnue).

Ecrivez la procédure ascendants(int k) de la classe ArbreBinaire qui, étant donnée la généalogie d'un individu, affiche sur le flux de sortie tous les ascendants masculins connus de l'individu à la k-ième génération.

Pour ne pas afficher la (les) (grand)-mère(s), il faut s'arrêter sur le (la) (k-1)-ième ascendant(e).

Ecrivez la méthode tousLesAscendants(int k) de la classe ArbreBinaire qui, étant donnée la généalogie d'un individu, affiche sur le flux de sortie tous les ascendants masculins connus de l'individu jusqu'a la k-ième génération.

Quand on est sur le (la) i-ième ascendant(e) (i < k), il est facile d'afficher son père (s'il existe).


EXERCICE 4

On définit les deux relations binaires suivantes sur les arbres binaires (A et B sont des arbres binaire) : Montrez que ces deux relations binaires sont des relations d'équivalence.

On rappelle qu'une relation d'équivalence est une relation réflexive, symétrique et transitive.

Ecrivez les méthodes equivalent et isomorphe de la classe Isomorphisme qui, respectivement, teste si deux arbres sont équivalents ou isomorphes.

Utilisez le fait que ces relations sont des relations d'équivalence et n'effectuez pas des tests inutiles.


EXERCICE 5

On considère les deux propriétés suivantes définies sur un arbre binaire : Expliquez en quoi les propriétés penche-à-gauche et équilibré sont semblables et donner la structure commune des méthodes qui testent ces deux propriétés,

Identifiez le type de parcours qu'on doit utiliser pour tester ces propriétés.

En définissant au besoin d'autres méthodes, écrivez les méthodes pencheAGauche() et equilibre() de la classe ArbreBinaire correspondants aux propriétés énoncées précédemment, de façon que ces méthodes aient une complexité linéaire.

Remarquez que les méthodes pencheAGauche(), taille(), equilibre() et hauteur() ont toutes la même structure.


EXERCICE 6

On définit le poids d'un arbre binaire de la manière suivante : Ecrivez la méthode poids() de la classe ArbreBinaire qui, étant donné A un arbre binaire, calcule son poids.

Aucune difficulté.

Deux arbres binaires sont dits isomorphes s'ils sont tous les deux vides ou si l'on peut obtenir l'un en transformation l'autre à l'aide d'une ou plusieurs permutations des deux sous-arbres issus d'un même noeud.

Expliquez dans quel cas la permutation de deux sous-arbres entraîne une diminution de poids. Ecrivez la méthode minimiser() de la classe Poids qui transforme un arbre binaire donné en un arbre binaire isomorphe de poids minimal en utilisant la méthode poids de la question précédente.

Pour permuter deux sous-arbres on utilise les méthodes gauche et droite en écriture.

Ecrivez une nouvelle version de la méthode minimiser() sans utiliser la méthode poids. Quelle est la différence fondamentale entre ces deux versions de la méthode minimiser ?

Inspirez-vous largement de l'exercice précédent.


EXERCICE 7

Un arbre binaire est harmonieux, si, soit l'arbre est vide, soit ses sous-arbres sont harmonieux et la hauteur de l'arbre n'excède pas le double de sa bassesse.

En définissant au besoin une classe interne et une méthode privée, écrivez la méthode estHarmonieux de la classe ArbreBinaire qui teste si un arbre binaire est harmonieux.

Même chose que les deux exercices précédents, mais cette fois on a besoin de deux informations pour décider éventuellement si un arbre est harmonieux.


EXERCICE 8

On désire affiner le parcours en largeur d'un arbre binaire et effectuer un parcours par niveaux. Le parcours par niveau imprime tous les noeuds de l'arbre de même profondeur sur la même ligne, à raison d'une ligne par profondeur.

Ecrivez la méthode parcoursNiveau de la classe ArbreBinaire qui affiche surle flux de sortie tous les éléments de l'arbre suivant l'ordre par niveau.

Modifiez la méthode parcoursLargeur étudiée en cours.


EXERCICE 9

On définit la largeur d'un arbre binaire comme le nombre maximum d'éléments que l'on peut trouver dans l'arbre à la même profondeur. Plus précisément, la largeur L(A) de l'arbre A est définie par :
L(A) = max{ Card(Ap) | 0 £ p £ h(A) }
Ap est l'ensemble des éléments de A à la profondeur p, Card(E) est le cardinal de E et h(A) la hauteur de A.

Expliquez pourquoi le parcours en profondeur n'est pas adapté à cet algorithme.

Essayez de définir la largeur inductivement sur les sous-arbres d'une arbre.

Ecrivez la méthode largeur de la classe ArbreBinaire qui calcule la largeur de l'arbre.

Inspirez-vous de l'exercice précédent.


EXERCICE 10

Le parcours en largeur peut-il remplacer parfois le parcours en profondeur ?

Reprenez l'exercice 3 en utilisant cette fois le parcours en largeur pour implémenter les méthodes ascendants et tousLesAscendants.

Pour identifier facilement les ascendants masculins à la k-ième génération, il faut connaître les ascendants à la (k-1)-ième génération.


This document was translated from LATEX by HEVEA.