Initiation `a la Programmation 2 (IP2) TP9
universit´e PARIS . DIDEROT
PARIS 7
Pendant tout ce tp, nous allons prendre comme exemple l’arbre suivant.
3 5
9
2 6
8
7
0 1
4
Commen¸cons par d´efinir diff´erentes fa¸cons de parcourir un arbre binaire :
1. Parcours infixe: on parcourt le sous-arbre de gauche dans l’ordre infixe, on visite le sommet puis on parcourt le sous-arbre de droite dans l’ordre infixe.
Pour l’arbre pr´ec´edent ce parcours est : 2 9 6 8 5 3 0 7 4 1.
2. Parcours pr´efixe : on visite le sommet, on parcourt le sous-arbre de gauche dans l’ordre pr´efixe puis on parcourt le sous-arbre de droite dans l’ordre pr´efixe.
Pour l’arbre pr´ec´edent ce parcours est : 3 5 9 2 6 8 7 0 1 4.
3. Parcours postfixe: on parcourt le sous-arbre de gauche dans l’ordre postfixe, on parcourt le sous-arbre de droite dans l’ordre postfixe puis on visite le sommet.
Pour l’arbre pr´ec´edent ce parcours est : 2 8 6 9 5 0 4 1 7 3.
On consid`ere ainsi la classe Noeudsuivante :
1 p u b l i c c l a s s N o e u d {
p r i v a t e int e t i q u e t t e ;
3 p r i v a t e N o e u d g a u c h e ; p r i v a t e N o e u d d r o i t ;
p u b l i c N o e u d (int e t i q u e t t e , N o e u d g , N o e u d d ) {
7 t h i s. e t i q u e t t e = e t i q u e t t e ; t h i s. g a u c h e = g ;
9 t h i s. d r o i t = d ; }
p u b l i c N o e u d (int e t i q u e t t e ) {
13 t h i s( e t i q u e t t e ,null,n u l l);
}
15 }
1. D´efinir une m´ethodepublic void afficheInfixe()dans la classeNoeudqui affiche l’arbre commen¸cant `athis dans l’ordre infixe.
2. Tester dans une classeMain la m´ethodeafficheInfixe() de la classeNoeud sur l’exemple donn´e en introduction grˆace au code suivant :
1
1 p u b l i c c l a s s M a i n {
3 p u b l i c s t a t i c v o i d m a i n ( S t r i n g [] a r g s ){
5 N o e u d a = new N o e u d (6 ,null,new N o e u d ( 8 ) ) ; N o e u d b = new N o e u d (9 , new N o e u d (2) , a );
7 N o e u d c = new N o e u d (5 , b , n u l l);
N o e u d d = new N o e u d (1 , new N o e u d (4) , n u l l);
9 N o e u d e = new N o e u d (7 , new N o e u d (0) , d );
N o e u d f = new N o e u d (3 , c , e );
f . a f f i c h e I n f i x e ();
13 }
}
3. D´efinir dans la classeNoeuddes m´ethodespublic void affichePrefixe()etpublic void affichePostfixe()qui affichentthis respectivement dans l’ordre pr´efixe et suffixe.
4. D´efinir dans la classe Noeud une m´ethode int nbDeNoeuds() qui retourne le nombre de nœuds dethis.
5. D´efinir dans la classeNoeudune m´ethodeint somme()qui retourne la somme des ´etiquettes dethis.
6. D´efinir dans la classe Noeudune m´ethodeint profondeur()qui retourne la profondeur de this. La profondeur d’un arbre est la longueur de sa plus longue branche ; par exemple la profondeur de l’arbre-exemple est 4 : sa plus longue branche est 3 – 5 – 9 – 6 – 8.
7. D´efinir dans la classeNoeud une m´ethode boolean recherche(int e) qui renvoietrue si un nœud de l’arbre est ´etiquet´e pare.
8. D´efinir un constructeurNoeud(Noeud arbre)qui cr´ee une copiede l’arbre donn´e en argu- ment.
9. (facultatif) D´efinir un nouveau constructeur Noeud(int[] tab) qui prend en entr´ee un tableau non vide de taillen.
— Soitrla moiti´e de n(arrondi `a l’inf´erieur : r = n/2).
— La racine dethis a pour ´etiquette tab[r].
— SoittabG = [tab[0], ...,tab[r−1]]. Le sous-arbre de gauche est new Noeud(tabG)et
— soittabD = [tab[r+1], ...,tab[l−1]]alors le sous-arbre de droite estnew Noeud(tabD).
Par exemplenew Noeud([0,1,2,3,4,5])est : 3 1
0 2
5 4
10. (facultatif) Tester le constructeur sur l’arbre pr´ec´edent via le code : int[] tab = {0 ,1 ,2 ,3 ,4 ,5};
N o e u d g = new N o e u d ( tab );
g . a f f i c h e I n f i x e ();
6 g . a f f i c h e P r e f i x e ();
Ce dernier doit afficher 0 1 2 3 4 5 et 3 1 0 2 5 4 .
2