La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Arbre binaire de recherche

Présentations similaires


Présentation au sujet: "Arbre binaire de recherche"— Transcription de la présentation:

1 Arbre binaire de recherche
Chapitre 5 Arbre binaire de recherche

2 Arbre binaire de recherche (ABR)
Est un arbre binaire dans lequel: Chaque nœud possède une clé, Chaque nœud du sous-arbre gauche possède une clé inférieure ou égale à celle du nœud considéré, Chaque nœud du sous-arbre droit possède une clé supérieure ou égale à celle-ci.

3 Exemple d’arbre binaire de recherche

4 Arbre binaire de recherche
Propriété : Le parcours symétrique (infixe) d'un ABR permet d'obtenir les éléments par ordre croissant.

5 Recherche d’un élément dans un arbre binaire de recherche
Le principe de la recherche est donné comme suit: Si l’arbre est vide : échec Recherche négative : l’élément n’appartient pas à l’arbre, on arrête la recherche Sinon : comparer l’élément avec l'étiquette de la racine de l’arbre S’il y a égalité : on a trouvé Recherche positive, on arrête la recherche Si l’élément est plus petit que la racine On poursuit la recherche sur le sous-arbre gauche Si l’élément est plus grand On poursuit la recherche sur le sous-arbre droit

6 Recherche d’un élément dans un arbre binaire de recherche
La recherche d’un élément dans ce type d’arbre est une généralisation de la recherche dichotomique dans un vecteur. La procédure de recherche dans un arbre de recherche est donnée comme suit:

7 Recherche d’un élément dans un arbre binaire de recherche
Procédure recherche(entrée Racine:<Type>, x:réel; sortie Adr : <Type>); Début Si racine=nil Alors Adr:=nil; Sinon Si Valeur(racine)>x Alors Recherche(Gauche(racine),x,Adr); Sinon Si Valeur(racine)<x Alors Recherche(Droit(racine),x,Adr); Sinon Adr:=racine; Fsi; Fin;

8 Insertion dans un ABR Principe 2 stratégies : 2 styles
Déterminer la place où insérer Réaliser l’insertion 2 stratégies : avec répétition sans répétition 2 styles impératif : construction sur place insertion en feuille fonctionnel : construction à côté insertion à la racine

9 Insertion en feuille dans un ABR (1)
Principe : parcourir l'arbre jusqu'à trouver une "place vide" (feuille, fils gauche vide ou fils droit vide) où placer « correctement » x a e i t a d l e i g t q

10 Insertion en feuille dans un ABR (2)
Insérer (x, A) si A est vide alors A = créer une feuille de valeur x sinon si x  Valeur(A) alors si le sous-arbre gauche est vide alors greffer à gauche de A une feuille d'étiquette x sinon Insérer x dans le sous-arbre gauche de A sinon si le sous-arbre droit est vide alors greffer à droite de A une feuille de valeur x sinon Insérer x dans le sous-arbre droit de A

11 Insertion à la racine dans un ABR
utilisée pour une recherche adaptative permet de retrouver plus rapidement les derniers éléments entrés principe : construire un nouvel arbre dont la racine est x le sous-arbre gauche G est une copie de l'arbre A où l'on a taillé tous les éléments supérieurs à x le sous-arbre droit D est une copie de l'arbre A où l'on a taillé tous les éléments inférieurs (ou égaux) à x

12 Insérer f à la racine pour ajouter un élément à la racine d’un arbre binaire de recherche, il faut d’abord couper l’arbre initial en 2 arbres G et D contenant respectivement tous les éléments inférieurs ou égaux à x et tous les éléments supérieurs à x, puis former l’arbre de racine x et de sous-arbre gauche G et de sous-arbre droit D e l g a i d q t G D a d e g i q t l f

13 Tailler les éléments supérieurs à x
TaillerSup(x, A) Si A est vide alors retourner arbre vide sinon si x > Valeur(A) alors Construire(Valeur(A),Gauche(A),TaillerSup(x, Droit(A))) sinon si x = Valeur(A) alors Construire(Valeur(A),Gauche(A), arbre vide) sinon (*x < Valeur(A)* ) TaillerInf(x, Gauche(A)))

14 Tailler les éléments inférieurs à x
TaillerInf(x, A) Si A est vide alors retourner arbre vide sinon si x < Valeur(A) alors Construire (Valeur(A), TaillerInf(x,Gauche(A)), Droit(A)) sinon (*x  Valeur(A)*) TaillerSup((x, Droit(A)))

15 Insérer à la racine InsererRacine(x, A)
Construire( x,TaillerSup(x, A), TaillerInf(x, A))

16 Suppression dans un ABR(1)
principe : chercher si l'élément est présent dans l'abr si l'élément est la valeur d'un nœud sans fils : couper la feuille (1) avec un seul fils : remplacer le nœud par ce fils (2) avec deux fils : remplacer la valeur du nœud par la plus grande clé du sous-arbre gauche (3) ou la plus petite clé du sous-arbre droit Puis raccrocher correctement r x Ad ****dessins pour les cas 1, 2, et sur la page suivante cas 3 • La plus grande clé du sous-arbre gauche : - c’est la clé de l’élément immédiatement inférieur à l’élément à supprimer - On la trouve en parcourant le sous-arbre gauche le plus à droite possible, c'est l'étiquette du premier nœud qui n'a pas de fils droit. Raccrocher correctement consiste à remplacer cette clé par son fils gauche • Exemple r x Ad fils

17 Exemple e p m x s e x l l p m Suppression de s
Remplacer s par p (la plus grande clé du fils gauche de s) Remplacer p par son fils gauche e p m x s e x l l Supprimer m : facile il n’a pas de fils Supprimer e : on remplace le e le plus au haut par son suivant et on raccroche l Supprimer encore un e : idem Encore un on remplace e par l Supprimer p : on le remplace par l Supprimer l : on le remplace par x Supprimer x Reste un arbre vide. 1 p m 2

18 Suppression dans un ABR
Supprimer(x, A) si A est vide retourner A si x < Valeur(A) alors greffer à gauche de A le résultat de Supprimer x dans le sous-arbre gauche de A et retourner A ainsi modifié si x > Valeur(A) alors idem à droite si x = Valeur(A) alors si A (le nœud d'étiquette x ) n'a pas de fils : retourner l'arbre vide a un seul fils (non vide) : retourner ce fils a deux fils non vides : (B, Max) = SupprimerMax(Gauche(A)) modifier étiquette de A avec Max, son fils gauche avec B retourner A Code en C : ABR AbrSupprimer (ELEMENT x, ABR a) { /* retourne l'arbre A où l'on a supprimé l'elt x ; "construction sur place" par appel aux primitives à effets de bord Greffer et ModifierValeur des arbres binaires*/ int d ; ELEMENT max ; if (ArbinVide(a)) return ArbinCreer() ; d = ElementComparer(x,ArbinValeur(a)) ; if (d == 0 ) /* x = Valeur (a), supprimer la racine de a */ if (ArbinVide(ArbinGauche(a))) a = ArbinDroit(a) ; else if(ArbinVide(ArbinDroit(a))) a = ArbinGauche(a) ; else { /* a possède 2 fils non vides */ ArbinGrefferAGauche(AbrSupprimeMax(&max, ArbinGauche(a)), a) ; ArbinModifierValeur( max, a); } else /* x est différent de l'étiquette de la racine de a*/ if (d < 0) ArbinGrefferAGauche(AbrSupprimer(x, ArbinGauche(a)), a); else ArbinGrefferADroite(AbrSupprimer(x, ArbinDroit(a)), a); return a;


Télécharger ppt "Arbre binaire de recherche"

Présentations similaires


Annonces Google