Chap. VII : arbres binaires 1. Introduction Arbre : collection d objets avec une structure hiérarchique Structure intrinsèque descendants d une personne (elle incluse) A ascendant connus d une personne (elle incluse) G B C D D E F E F G B C H I J A 1
Structure imposée pour les besoins de l application séquence de symboles 3 + (5 6) 4 + ensemble {0, 1, 3, 4, 5, 6, 7, 9} 5 3 3 7-4 0 4 6 9 Structure commune : 5 6 R 1 Définition Un élément en haut : racine de l arbre Des arbres sous la racine : sous-arbres 2
2. Terminologie A B C D E F G H I J nœud (assimilé à la valeur qu il contient) : 10 nœuds de A à J feuille : E, H, I, J, C, G nœud interne : A, B, D, F nœud fils d un nœud : B, C, D fils de A nœud père d un nœud : A père de B, C, D descendant d un nœud : E, F, H, I, J descendants de B ancêtre d un nœud : A, B, F ancêtres de H 3
... Terminologie A B C D E F G H I J chemin : séquence de nœuds d un nœud à un de ses descendants. Exemples : A B F ; D G branche : chemin de la racine à une feuille. Exemple : A B F I hauteur : maximum de la longueur des branches (ici 3) arbre dégénéré ou filiforme : chaque nœud a 0 ou 1 fils A B C D 4
3. Arbres binaires Chaque nœud a au plus 2 fils Exemple : ascendants (dessin retourné) A B C D E F G Les feuilles n ont pas de fils (sous-arbre) : D, G et F Les nœuds internes ont deux ou un fils (sous-arbres) A et C ont 2 fils (sous-arbres) : gauche et droit B a un fils (sous-arbre) droit E a un fils (sous-arbre) gauche 5
Arbres binaires particuliers Localement complet les nœuds internes ont 2 fils nb feuilles = nb nœuds + 1 Complet localement complet et branches de même longueur nb feuilles = 2 hauteur nb nœuds = 2 hauteur+1 1 ; hauteur = log 2 (nb nœuds) 6
Parfait : quasi complet Tous les niveaux sont remplis, sauf éventuellement le dernier Dernier niveau : nœuds tassés à gauche hauteur = log 2 (nb nœuds) arbres complets sans restriction sur le nombre de nœuds 7
4. Types Ada pour les arbres binaires Exemples : entiers dans les nœuds Cas particulier des arbres parfaits tableau, rangement par niveau A 1 2 3 4 5 6 B C A B C D E F D E F Si le premier indice (celui de la racine) est 1 : Fils du nœud d indice i : aux indices 2i et 2i + 1 Père du nœud d indice i : à l indice i/2 Inconvénient : nombre de nœuds doit être fixé (ou borné) 8
Cas général : utiliser des pointeurs Nœud : une valeur (entier) et deux sous-arbres article (Sous-)Arbre : un pointeur vers un nœud type Noeud; type Arbre is access Noeud; type Noeud is record Val : Integer; Gauche, Droit : Arbre; end record; Sous-arbre absent (feuille ou nœud à 1 fils) : null (Arbre vide) 2 4 5 2 4 5 6 1 7 6 1 7 8 8 9
5. Parcours d arbres Nœud le plus à gauche d un arbre non vide 2 4 5 C 8 6 9 1 7 function Noeud_Gauche (A : Arbre) return Arbre is C : Arbre := A; begin while C.Gauche /= null loop C := C.Gauche; end loop; return C; end Noeud_Gauche; 10
Feuille la plus à gauche d un arbre non vide G 4 8 6 9 7 3 2 5 1 7 function Feuille_Gauche (A : Arbre) return Arbre is G : Arbre := Noeud_Gauche (A); begin while G.Droit /= null loop G := Noeud_Gauche (G.Droit); end loop; return G; end Feuille_Gauche; On descend un chemin = algo itératif 11
Nombre de nœuds d un arbre function Nb_Noeuds (A : Arbre) return Natural is begin if A = null then --> arbre vide return 0; else --> arbre non vide return 1 + --> on compte le noeud Nb_Noeuds (A.Gauche) + --> son ss-arbre gauche Nb_Noeuds (A.Droit); --> son ss-arbre droit end if; end Nb_Noeuds; On parcourt (potentiellement) tout l arbre en traitant tout un sous-arbre avant de passer à l autre parcours en profondeur = algo récursif 12
Hauteur d un arbre non vide function Hauteur (A : Arbre) return Natural is begin if A.Gauche = null and A.Droit = null then return 0; else return 1 + Integer Max (Hauteur (A.Gauche), Hauteur (A.Droit)); end if; end Hauteur; Incorrect : un nœud interne peut avoir un de ses sous-arbres vide 13
Hauteur d un arbre non vide function Hauteur (A : Arbre) return Natural is begin if A.Gauche = null then if A.Droit = null then return 0; else return 1 + Hauteur (A.Droit); end if; elsif A.Droit = null then return 1 + Hauteur (A.Gauche); else return 1 + Integer Max (Hauteur (A.Gauche), Hauteur (A.Droit)); end if; end Hauteur; 14
Hauteur d un arbre function Hauteur (A : Arbre) return Integer is begin if A = null then return -1; else return 1 + Integer Max (Hauteur (A.Gauche), Hauteur (A.Droit)); end if; end Hauteur; si A est une feuille : h (A) = 1 + max (-1, -1) = 0 si A.Gauche est vide et A.Droit est non vide : h (A) = 1 + max (-1, h (A.Droit)) = 1 + h (A.Droit) Si A.Droit est vide et A.Gauche est non vide : h (A) = 1 + max (h (A.Gauche), -1) = 1 + h (A.Gauche) 15
Affichage préfixé (infixé, postfixé) + 2 préfixé : infixé : postfixé : + 2 4 7 2 + 4 7 2 4 7 + 4 7 procedure Afficher (A : in Arbre) is begin if A /= null then Put (A.Val); --> préfixé Afficher (A.Gauche); -- Put (A.Val); --> infixé Afficher (A.Droit); -- Put (A.Val); --> postfixé end if; end Afficher; 16