Vous êtes sur la page 1sur 9

IFT2810 Automne 2008

Introduction aux arbres

Concepts de base

Un arbre est constitu dun ensemble de nuds et de branchesreliant les nuds. e Le degr dun nud est le nombre de branches connectes au nud. Le premier nud e e ` part la racine, tous les nuds de dun arbre (celui sans branche entrante) est la racine. A larbre ont une seule branche entrante. Chaque nud de larbre peut avoir, 0, 1 ou plusieurs branches sortantes. Un nud avec 0 branches sortantes est une feuille. Les nuds autre que la racine et les feuilles sont appels nuds internes. Si une branche sortante relie u e ` v, alors u est le p`re de v et v est le ls de u. Deux nuds adjacents sont deux nuds a e relis par une branche. Un chemin est une suite de nuds adjacents. Tout nud peut tre e e atteint en suivant un chemin unique de la racine ` ce nud. Le niveau dun nud v est a le nombre de nuds sur le chemin de la racine au p`re de v. En particulier, la racine est e au niveau 0, et les ls de la racine sont au niveau 1. Un anctre dun nud v est tout e nud sur le chemin de v ` la racine. En particulier, la racine est lanctre de tous les autres a e nuds. Le descendant dun nud v est tout nud sur le chemin de v ` une feuille de a larbre. En particulier, tous les nuds sont des descendants de la racine. La hauteur (ou profondeur) dun arbre est le plus haut niveau de larbre plus 1. Par exemple, le niveau de larbre ` la gure 1 est 4. a Un sous-arbre est toute structure connecte en dessous de la racine. Par exemple, e dans la gure 1, le sous-arbre de racine B contient les nuds B, C, D, J.

Arbre binaire

Un arbre est binaire si chaque nud de larbre a au plus deux ls (0, 1 ou 2 ls) (gure 2). Les deux ls dun nud sont appels ls gauche et ls droit. Un nud peut e avoir 0 ls, un ls gauche uniquement, ou un ls droit uniquement. La hauteur maximale dun arbre binaire de N nuds est Hmax = N. La hauteur minimale dun arbre binaire de N nuds est Hmin = log2 (N) + 1. Un arbre binaire de hauteur H a un minimum de Nmin = N nuds et un maximum de Nmax = 2H 1 nuds. Moins un arbre est haut, plus la recherche dun nud dans cet arbre est ecace.

niveau 0

racine

niveau 1

B pere

niveau 2

ls

feuille

niveau 3

Fig. 1 Arbre gnral. e e

Fig. 2 Arbre binaire balanc e

Arbre balanc Soit A un arbre de racine r, et Al , Ar les deux sous-arbres de A de racines e respectives les ls gauche et droit de r (lun des deux sous-arbres, ou les deux, peuvent tre vides). e Un arbre vide est balanc. e A est balanc ssi Al et Ar ont une hauteur qui di`re dau plus 1 (0 ou 1 ou -1) et e e les sous-arbres de Al et Ar sont aussi balancs. e Larbre de la gure 2 est balanc. Larbre de la gure 3 est aussi balanc. e e
A

Fig. 3 Arbre complet

Arbre complet Un arbre binaire de hauteur H est complet sil a le maximum de nuds pour sa hauteur, autrement dit, 2H 1 nuds (gure 3). Un arbre binaire de N nuds est presque complet sil est de hauteur minimale, i.e. de hauteur Hmin = log2 (N) + 1, et si tous les nuds du dernier niveau se retrouvent ` gauche de larbre (Figures 4). a
A A

Fig. 4 Arbres balancs, presque complets e

Structure dun arbre binaire Chaque nud de la structure doit contenir un champs pour les donnes, et deux pointeurs : un vers le ls gauche et un vers le ls droit. e

noeud data filsGauche filsDroit fin noeud

<type de donnees> <pointeur vers noeud> <pointeur vers noeud>

Parcours dun arbre binaire

Un parcours darbre doit passer par chaque nud une et une seule fois. Il existe deux parcours : parcours en profondeur (depth-rst traversal) et parcours en largeur (breadth rst traversal).

3.1

Parcours en profondeur

Soit A un arbre de racine r, de sous-arbre gauche Al et de sous-arbre droit Ar .


racine

sous-arbre gauche

sous-arbre droit

Fig. 5 Sous-arbres gauche et droit dun arbre binaire. Il existe trois sortes de parcours en profondeur. Ce sont des procdures rcursives e e dcrites de la faon suivante : e c 1. Parcours en prordre : Pour chaque nud de larbre, explorer le nud, puis son ls e gauche, puis son ls droit. 2. Parcours en ordre : Pour chaque nud de larbre, explorer son ls gauche, puis le nud lui mme, puis son ls droit. e 3. Parcours en postordre : Pour chaque nud, explorer son ls gauche, puis son ls droit, puis le nud lui mme. e

Parcours en prordre e
Algorithme preOrdre (racine <pointeur-arbre>) 1. Si (racine = NULL) 2. traiter(racine) ; 3. preOrdre(racine->filsGauche); 4. preOrdre(racine->filsDroit); 5. Fin Si

Parcours en ordre
Algorithme enOrdre (racine <pointeur-arbre>) 1. Si (racine = NULL) 2. enOrdre(racine->filsGauche) ; 3. traiter(racine) ; 4. enOrdre(racine->filsDroit) ; 5. Fin Si

Parcours en postordre
Algorithme postOrdre (racine <pointeur-arbre>) 1. Si (racine = NULL) 2. postOrdre(racine->filsGauche); 3. postOrdre(racine->filsDroit); 4. traiter(racine) ; 5. Fin Si

3.2

Parcours en largeur

Dans un parcours en largeur, on explore tous les nuds dun niveau n avant de passer au niveau n + 1. Pour cela, on utilise une le.

Algorithme parcoursLargeur (racine <pointeur-arbre>) 1. pointeur := racine ; 2. creeFile(file) ; 3. Tant que (pointeur = NULL) 4. traiter(pointeur) ; 5. Si (pointeur->filsGauche = NULL) 6. insereFile(file,pointeur->filsGauche) ; 7. Fin Si 8. Si (pointeur->filsDroit = NULL) 9. insereFile(file, pointeur->filsDroit) ; 10. Fin Si 11. Si (fileVide(file) = Faux) 12. supprimeFile(file,pointeur) ; 13. Sinon 14. pointeur := NULL ; 15. Fin Si 16. Fin Tant que

Application : arbres dexpressions

Une expression arithmtique peut-tre reprsente de trois faons direntes : inxe, e e e e c e e postxe et prxe. e e e Exp. Prxe : + a b e e Exp. Inxe : e a + b Exp. Postxe : a b + e Les expressions postxes et prxes ne ncessitent pas de parenth`ses pour tre e e e e e e values. Les expressions inxes doivent tre transformes en expressions postxes ou e e e e e e prxes pour pouvoir tre values par les langages de programmation. e e e e e Transformation dune expression inxe en une expression postxe : e e A * A * B + A + B * A + B * C - D / B C C E A A A A B B B B * * C + C * + C * + D E / -

Avec une pile : On utilise une pile pour empiler les oprateurs successifs rencontrs. Au e e dbut la pile est vide. Lide de lalgorithme est la suivante : Lire lexpression de gauche e e ` droite. Si le caract`re lu est un oprande, on limprime. Supposons que le caract`re lu a e e e soit loprateur o, et que loprateur du sommet de pile soit p. Si la prcdence de o est e e e e suprieure ` la prcdence de p, alors on empile o. Sinon, on dpile tous les oprateurs qui e a e e e e ont une prcdence suprieure ` celle de o. e e e a

Algorithme inToPostFix (expression, postFix) 1. creePile (pile) ; 2. postFix := motVide ; 3. indice := 0 ; 4. Tant que (indice < taille-expression) 5. donnee := expression[indice] ; 6. Si ( donnee = ( ) 7. empile (pile,donnee) ; 8. Sinon Si (donnee = ) ) 9. depile (pile,donnee) ; 10. Tant que ( donnee = ( ) 11. concatene(postFix,donnee) ; 12. depile (pile,donnee) ; 13. Fin Tant que 14. Sinon Si (donnee est un operateur) 15. sommetPile (pile, top) ; 16. Tant que ( pileVide(pile) = FAUX) Et (priorite(donnee) <= priorite(top)) ) 17. depile(pile,donneeOut) ; 18. concatene(postFix,donneeOut) ; 19. sommetPile (pile, top) ; 20. Fin Tant que 21. empile (pile,donnee) ; 22. Sinon 23. concatene(postFix,donnee) ; 24. Fin Si 25. indice := indice + 1 ; 26. Fin Tant que 27. Tant que (pileVide(pile) = FAUX) 28. depile (pile,donnee) ; 29. concatene(postFix,donnee) ; 30. Fin Tant que 31. Retourne (postFix) ;

Evaluation dune expression postxe On utilise une pile pour empiler les oprandes. e e Lorsque le caract`re lu est un oprateur, on dpile les deux derniers lments de la pile, on e e e ee eectue lopration correspondante, et on remet le rsultat dans la pile. e e Reprsentation dune expression par un arbre On utilise un arbre binaire ayant e les proprit suivantes : ee 1. Chaque feuille est un oprande. e 2. La racine et les nuds internes sont des oprateurs. e 3. Les sous-arbres reprsentent des sous-expressions. e
+

Fig. 6 Arbre de lexpression a (b + c) + d.

Impression de lexpression inxe On veut dvelopper un algorithme qui parcourt e e larbre et imprime lexpression inxe parenthse. e ee
Algorithme inx (arbre <pointeur-arbre>) 1. Si (arbre = NULL) 2. Si (arbre->donnee est un operande) 3. print(arbre->donnee) ; 4. Sinon 5. print(() ; 6. inx (arbre->filsGauche) ; 7. print(arbre->donnee) ; 8. inx (arbre->filsDroit) ; 9. print()) ; 10. Fin Si 11. Fin Si

Impression de lexpression postxe On veut dvelopper un algorithme qui parcourt e e larbre et imprime lexpression postxe. e

Algorithme postx (arbre <pointeur-arbre>) 1. Si (arbre = NULL) 2. postx (arbre->filsGauche) ; 3. postx (arbre->filsDroit) ; 4. print(arbre->donnee) ; 5. Fin Si

Impression de lexpression prxe On veut dvelopper un algorithme qui parcourt e e e larbre et imprime lexpression prxe. e e

Algorithme prex (arbre <pointeur-arbre>) 1. Si (arbre = NULL) 2. print(arbre->donnee) ; 3. prex (arbre->filsGauche) ; 4. prex (arbre->filsDroit) ; 5. Fin Si