Nour-Eddine Oussous, Éric Wegrzynowski 21 novembre 2007 Parcours d arbres Parcours préfixé Parcours postfixé Parcours infixé Algorithmes sur les arbres binaires Recherche d un élément Arbres binaires ordonnés et propriété Recherche dans un arbre ordonné Différents parcours Un exemple d arbre à parcourir Contrairement aux listes que l on parcourt de manière séquentielle, il y a plusieurs parcours possibles d un arbre : le parcours préfixé ; le parcours postfixé ; et le parcours infixé. 1 2 3 4 5 6 7 8 9 10 11 Fig.: Exemple d arbre à parcourir
Parcours préfixé Parcours préfixé Parcours consistant à 1. traiter la racine 2. parcourir le sous-arbre gauche 3. parcourir le sous-arbre droit Exemple Sur l arbre de la figure 1, dans un parcours préfixé, les nœuds sont traités dans l ordre 1, 2, 4, 8, 5, 9, 10, 3, 6, 11, 7 Parcours postfixé Parcours postfixé Parcours consistant à 1. parcourir le sous-arbre gauche 2. parcourir le sous-arbre droit 3. traiter la racine Exemple Sur l arbre de la figure 1, dans un parcours postfixé, les nœuds sont traités dans l ordre 8, 4, 9, 10, 5, 2, 11, 6, 7, 3, 1 Parcours infixé Parcours infixé Parcours consistant à 1. parcourir le sous-arbre gauche 2. traiter la racine 3. parcourir le sous-arbre droit Exemple Sur l arbre de la figure 1, dans un parcours infixé, les nœuds sont traités dans l ordre 8, 4, 2, 9, 5, 10, 1, 6, 11, 3, 7 taille : AB(E) N a taille de a = nbre de nœuds taille( ) = 0 taille(<1; <3; ; >; >) = 2
Algorithme Schéma récursif du calcul de la taille d un arbre a 1. si a =, alors taille(a) = 0 2. si a = <e; g; d >, alors taille(a) = 1 + taille(g) + taille(d) Taille / / t a i l l e ( a ) = n b r e d e n o e u d s d a n s a function t a i l l e ( a : ARBRE) : CARDINAL ; if e s t A r b r e V i d e ( a ) then t a i l l e := 0 else t a i l l e := 1 + t a i l l e ( gauche ( a ) ) + t a i l l e ( d r o i t ( a ) ) ; end { t a i l l e } ; Coût du calcul de la taille Rappel c(a) = nombre de tests de la condition estarbrevide(a). c( ) = 1 c(<e; g; d >) = 1 + c(g) + c(d) Le coût de la fonction taille est linéaire en le nombre de nœuds de l arbre. de la hauteur La hauteur d un arbre est la longueur de sa plus longue branche. cela impose que l arbre n est pas vide en conséquence la hauteur de l arbre vide n est pas définie par cette définition
Rappel hauteur : AB(E) N a hauteur de a hauteur(<1; ; >) = 0 hauteur(<1; <3; ; >; >) = 1 Convention Pour faciliter le calcul (récursif) de la hauteur d un arbre, nous conviendrons que la hauteur de l arbre vide est égale à -1. hauteur( ) = 1 Algorithme hauteur : AB(E) N { 1} a hauteur de a Schéma récursif du calcul de la hauteur d un arbre a 1. si a =, alors hauteur(a) = 1 hauteur( ) = 1 hauteur(<1; ; >) = 0 hauteur(<1; <3; ; >; >) = 1 2. si a = <e; g; d >, alors hauteur(a) = 1 + max(hauteur(g), hauteur(d))
Hauteur / / h a u t e u r ( a ) = h a u t e u r d e a function h a u t e u r ( a : ARBRE) : INTEGER ; if e s t A r b r e V i d e ( a ) then h a u t e u r := 1 else h a u t e u r := 1 + max( h a u t e u r ( gauche ( a ) ), h a u t e u r ( d r o i t ( a ) ) ) ; end { h a u t e u r } ; Coût du calcul de la hauteur c(a) = nombre de tests de la condition estarbrevide(a). c( ) = 1 c(<e; g; d >) = 1 + c(g) + c(d) Le coût de la fonction hauteur est linéaire en le nombre de nœuds de l arbre. Recherche d un élément recherche : E AB(E) Booleen { Vrai si e a e, a Faux sinon recherche(1, <1; <3; ; >; >) = Vrai recherche(2, <1; <3; ; >; >) = Faux Recherche d un élément Recherche / / r e c h e r c h e ( e, a ) = V R A I s i e a / / FAUX s i n o n function r e c h e r c h e ( e : ELEMENT; a : ARBRE) : BOOLEAN ; if e s t A r b r e V i d e ( a ) then r e c h e r c h e := false else if r a c i n e ( a)=e then r e c h e r c h e := true else r e c h e r c h e := r e c h e r c h e ( e, gauche ( a ) ) or r e c h e r c h e ( e, d r o i t ( a ) ) ; end { r e c h e r c h e } ;
Recherche d un élément Coût de la recherche c(a) = nombre de tests de la condition estarbrevide(a). meilleur cas : e se trouve à la racine, on fait un seul test pire cas : e n est pas dans l arbre ou se trouve dans la dernière feuille, c(a) est linéaire en n et propriété On suppose que l ensemble E des étiquettes des nœuds des arbres est un ensemble totalement ordonné par une relation notée. Un arbre A AB(E) est ordonné si 1. il est vide, A = 2. ou bien, il ne l est pas, A = <e; g; d >, et il vérifie les quatre conditions suivantes g est un arbre binaire ordonné ; d est un arbre binaire ordonné ; e est inférieur à toutes les étiquettes de d ; e est supérieur ou égal à toutes les étiquettes de g ; L ensemble des arbres binaires ordonnés est noté ABO(E). et propriété et propriété 3 1 4 1 2 5 9 2 1 9 1 5 4 3
et propriété Propriété caractéristique Théorème Soit A AB(E) un arbre binaire. A est un arbre binaire ordonné si et seulement si la liste des étiquettes des nœuds dans l ordre infixé est une liste triée dans l ordre croissant. Recherche dans un arbre ordonné rechercheabo : E ABO(E) Booleen { Vrai si e a e, a Faux sinon rechercheabo(1, 3;<1; <1; ; >; <2; ; >> <4; ; <5; ; <9; ; >>> = Vrai rechercheabo(6, 3;<1; <1; ; >; <2; ; >> <4; ; <5; ; <9; ; >>> = Faux Recherche dans un arbre ordonné / / r e c h e r c h e A B O ( e, a ) = V R A I s i e a / / FAUX s i n o n function rechercheabo ( e : ELEMENT; a : ARBRE) : BOOLEAN ; if e s t A r b r e V i d e ( a ) then rechercheabo := false else if r a c i n e ( a ) = e then rechercheabo := true else if r a c i n e ( a ) > e then rechercheabo := rechercheabo ( e, gauche ( a ) ) else rechercheabo := rechercheabo ( e, d r o i t ( a ) ) ; end { r e c h e r c h e A B O } ; Recherche dans un arbre ordonné Coût de la recherche c(a) = nombre de tests de la condition estarbrevide(a). meilleur cas : l élément se trouve à la racine, un seul test pire cas : ce nombre dépend de la hauteur de l arbre si l arbre est bien équilibré, pour un ABO de n nœuds, ce nombre sera majoré par log 2 (n) si l arbre est un peigne, ce nombre sera proportionnel à n Le coût de la fonction rechercheabo dépend de la forme de l arbre.
insererabo : E ABO(E) ABO(E) e, a a a = arbre a modifié par l ajout en feuille du nouvel élément e. 3141592 insererabo(4, <3; <1; ; >; >) = <3; <1; ; >; <4; ; >> insererabo(1, <3; <1; ; >; <4; ; >>) = <3; <1; <1; ; >; >; <4; ; >> 141592 3 / / i n s e r e r A B O ( e, a ) 3141592 314159 2 / / a j o u t e u n n o u v e l é l é m e n t e e n f e u i l l e d e / / l a r b r e a. L a r b r e a e s t m o d i f i é procedure insererabo ( e : ELEMENT; var a : ARBRE) ; var b : ARBRE ; if estarbrevide ( a ) then 41592 3 1 a := c r e e r A r b r e ( e, ARBREVIDE, ARBREVIDE) else if r a c i n e ( a ) <= e then b := d r o i t ( a ) ; insererabo ( e, b ) ; m o d i f i e r D r o i t ( a, b ) ; end else b := gauche ( a ) ; insererabo ( e, b ) ; m o d i f i e r G a u c h e ( a, b ) ; end ; end { i n s e r e r A B O } ; 1592
Coût de l insertion c(a) = nombre de tests estarbrevide(a). L insertion se fait en feuille Ce nombre dépend de la hauteur de l arbre si l arbre est bien équilibré, pour un ABO de n nœuds, ce nombre sera majoré par log 2 (n) si l arbre est un peigne, ce nombre sera proportionnel à n Il est donc souhaitable d équilibrer les arbres au fur et à mesure des opérations d insertion Le coût de la fonction insererabo dépend de la forme de l arbre.