0% ont trouvé ce document utile (0 vote)
125 vues8 pages

Algorithmes de Parcours d'Arbres Binaires

Ce document présente différentes fonctions pour les parcours et traitements d'arbres binaires, notamment des fonctions récursives et itératives pour les parcours préfixé, infixé et postfixé.

Transféré par

selsabilhaddab2004
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Thèmes abordés

  • Fonction de recherche de nœuds…,
  • Fonction de gestion de valeur …,
  • Parcours postfixé,
  • Fonction de gestion de pile,
  • Fonction de recherche dans ABR,
  • Fonction de gestion de racine,
  • Fonction de gestion de valeur …,
  • Fonction de gestion de valeur …,
  • Fonction de gestion de valeur …,
  • Fonction de gestion de valeur …
0% ont trouvé ce document utile (0 vote)
125 vues8 pages

Algorithmes de Parcours d'Arbres Binaires

Ce document présente différentes fonctions pour les parcours et traitements d'arbres binaires, notamment des fonctions récursives et itératives pour les parcours préfixé, infixé et postfixé.

Transféré par

selsabilhaddab2004
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Thèmes abordés

  • Fonction de recherche de nœuds…,
  • Fonction de gestion de valeur …,
  • Parcours postfixé,
  • Fonction de gestion de pile,
  • Fonction de recherche dans ABR,
  • Fonction de gestion de racine,
  • Fonction de gestion de valeur …,
  • Fonction de gestion de valeur …,
  • Fonction de gestion de valeur …,
  • Fonction de gestion de valeur …

BENADJIMI Noussaiba Révision sur les arbres Université d’Alger/2017

Type pour les arbres binaires Fonction 4 : Parcours Postfixé


Type Pointeur : ↑Nœud Procédure Par_postfixe(E/ racine: Pointeur )
Début
Type Nœud=enregistrement Si (racine <>Nil) Alors
Valeur : entier // la valeur du nœud Par_préfixe (racine↑.Fils_G) ;
Fils_G: Pointeur; // le fils gauche Par_préfixe (racine↑.Fils_D) ;
Fils_D: Pointeur; // le fils droit Écrire (racine↑.valeur) //afficher la valeur de la racine du
Fin; //sous-arbre courant en dernier
Fsi ;
Fonction d’allocation Fin;

Fonction 1 : Création_Nœud
Fonction Créer_Nœud(val : entier):Pointeur Fonction 5 : Parcours Préfixé (version itérative)
Var nœud : Pointeur; Procédure Par_préfixe(E/ racine: Pointeur )
Début Var nœud : Pointeur
Nouveau(nœud) ; // allouer un nouveau nœud pile : Pile de Pointeur // Pile pour garder trace des
nœud↑.valeur← val; // affecter les champs du nœud //nœuds visités
nœud↑.Fils_G← Nil; /////////////////////////////////////////////////////////////////////////////////////////////////////
nœud↑.Fils_D← Nil; // Soient les fonctions suivantes permettant de traiter les pile
Créer_Nœud← nœud; //récupérer la nœud créé // Nouveau(pile) : créer une pile vide
Fin; // Vide(pile) : retourne vrai si la pile est vide, faux sinon
// Empiler(pile, X) : empiler l’élément X au sommet de la
// pile. ( X doit être du type compatible
// avec la pile
// Dépiler(pile, X) : dépiler le sommet de la pile dans
Fonctions des parcours des arbres binaires // l’élément X
/////////////////////////////////////////////////////////////////////////////////////////////////////
Fonction 2 : Parcours Préfixé (version récursive)
Procédure Par_préfixe(E/ racine: Pointeur ) Début
Début Nouveau(pile) ; //créer une nouvelle pile pour les nœuds.
Si (racine <>Nil) Alors nœud ← racine ;
Écrire (racine↑.valeur) //afficher la valeur du nœud courant TQ nœud <> Nil OU non Vide(pile) Faire // répéter le
// traitement tant que la pile est non vide ou le nœud n’est pas à Nil
@ Par_préfixe (racine↑.Fils_G); //appel récursif pour visiter le
// fils gauche. TQ nœud <> Nil Faire // Afficher les fils gauches
Par_préfixe (racine↑.Fils_D) ; //appel récursif pour le visiter Écrire (nœud ↑.valeur) ; //afficher la valeur du nœud
Fsi ; // fils droit.
Empiler (pile, nœud ) ; // empiler le nœud pour visiter
Fin; //son sous-arbre droit ultérieurement
nœud ← nœud↑.Fils_G ; //avancer jusqu’au nœud le
//plus à gauche
 Important : Dans un appel récursif, dès qu’on Fait ;
termine l’appel (aucun autre appel interne) on reprend le
traitement juste après l’appel origine. Dans l’algorithme Dépiler (pile, nœud ) ; // dépiler le nœud pour visiter
précédent, lorsque le traitement de l’appel Par_préfixe //le sous-arbre droit (la valeur du nœud
(racine↑.Fils_G), on reprend le traitement juste avant // a été déjà affichée).
l’appel Par_préfixe (racine↑.Fils_D) (Flèche bleu). nœud ← nœud↑.Fils_D ; //passer au sous-arbre droit
Fait;
Fin;
Fonction 3 : Parcours Infixé (version récursive)
Procédure Par_infixe(E/ racine: Pointeur )  Important : Dans la version itérative des
Début algorithmes du parcours des arbres, il est impératif
Si (racine <>Nil) Alors d’utiliser la pile pour garder trace des nœuds parcourus
Par_préfixe (racine↑.Fils_G) ; //visiter le fils gauche en afin de pouvoir les visiter tous .
// premier.
Écrire (racine↑.valeur) //afficher la valeur de la racine du
//sous-arbre courant
Par_préfixe (racine↑.Fils_D) ; //visiter le fils droit en dernier
Fsi ;
Fin;

-- 1 --
BENADJIMI Noussaiba Révision sur les arbres Université d’Alger/2017

Fonction 6 : Parcours Infixé (version itérative)


nœud ← nœud↑.Fils_D ; //passer au sous-arbre droit
Procédure Par_infixe(E/ racine: Pointeur )
Var nœud : Pointeur Sinon // si le sous-arbre droit est déjà visité → afficher
pile : Pile de Pointeur Écrire (nœud ↑.valeur) ; // la valeur du nœud
Début nœud ←Nil ; // pour explorer d’autre branches (autre
Nouveau(pile) ; //créer une nouvelle pile pour les nœuds. // que la branche courant s’il y en a
nœud ← racine ; Fsi ;
Fait;
TQ nœud <> Nil OU non Vide(pile) Faire.
TQ nœud <> Nil Faire Fin;
Empiler (pile, nœud ) ; // empiler le nœud sans affichage
// pour visiter son sous-arbre gauche avant l’affichage
nœud ← nœud↑.Fils_G ; //avancer jusqu’au nœud le  Important : Il est fortement conseillé d’utiliser
//plus à gauche le principe des trois fonctions précédentes (récursif et
Fait ; itératif) pour réaliser la plus part des traitements
Dépiler (pile, nœud ) ; // dépiler le nœud pour visiter appliqués sur les arbres binaires. La différence sera
//le sous-arbre droit. au niveau du traitement (au lieu de l’affichage)
Écrire (nœud ↑.valeur) ; //afficher la valeur avant d’explorer
//le sous-arbre droit
Fonctions de recherche dans les arbres
nœud ← nœud↑.Fils_D ; //passer au sous-arbre droit
binaires de recherche
Fait;
Fin; Fonction 8 : Rechercher dans un ABR, et retourner le
nœud et son père (version itérative).

Fonction 7 : Parcours Postfixé (version itérative) Procédure Search_ABR(E/ racine: Pointeur , E/ val :
entier, S/ nœud: Pointeur , S/ père: Pointeur)
Procédure Par_postfixe(E/ racine: Pointeur )
Var père : Pointeur;
Var nœud : Pointeur nœud : Pointeur;
pile : Pile de Pointeur
trouve : Booléenne.
DV : Booléenne Début
droit_visité : Pile de Booléenne
père← Nil ; // initialiser le père
Début nœud← racine;
///////////////////////////////////////////////////////////////////////////////////////////////////// trouve← faux ;
// Ici on doit empiler avec chaque nœud un indice pour dire si le
// sous-arbre droit à été visité ou non. C’est le rôle de la pile TQ (non trouve ET nœud<>Nil) Faire
// droit_visité Si (nœud↑.valeur=val) Alors //nœud trouvé
/////////////////////////////////////////////////////////////////////////////////////////////////////
trouve← vrai;
Nouveau(pile) ; Sinon
Nouveau(droit_Visité) ; père← nœud; //mis à jour du père
nœud ← racine ; Si (nœud↑.valeur<val) Alors //passer au fils
// gauche pour visiter le sous-arbre gauche
DV← faux ;
nœud ← nœud↑.Fils_G ;
TQ nœud <> Nil OU non Vide(pile) Faire Sinon //passer au fils droit pour visiter le
// sous-arbre droit
TQ nœud <> Nil Faire nœud ← nœud↑.Fils_D ;
Empiler (pile, nœud ); // empiler le nœud sans affichage Fsi ;
Empiler (droit_Visité, faux) ; // empiler son état : fils Fsi ;
//droit non visité encore Fait;
nœud ← nœud↑.Fils_G ; // descendre jusqu’au fils le plus
// à gauche
//////////////////////////////////////////////////////////////////////////////////////////////
Fait ; // concernant le nœud père et si la valeur cherchée n’existe pas
Dépiler (pile, nœud ) ; // dépiler le nœud pour visiter le sous- // dans l’arbre , il s’agit du père du nœud à insérer si on veut
//arbre droit toujours avant l’affichage // insérer cette valeur absente dans l’arbre. Voir fonction 10.
Dépiler (droit_Visité, DV) ; // dépiler également l’état de //////////////////////////////////////////////////////////////////////////////////////////////
// sous-arbre droit (visité ou non)
Si(DV=faux) Alors // si le sous-arbre droit n’est pas
// encore visité Fin;
Empiler (pile, nœud ) ; // ré-empiler le nœud avec un état
Empiler (droit_Visité, vrai) ; //vrai pour indiquer que
// le sous-arbre droit a été visité

-- 2 --
BENADJIMI Noussaiba Révision sur les arbres Université d’Alger/2017

Fonction 9 : Recherche dans une ABR, (version récursive), Si (père = Nil) Alors //l’arbre est vide →
ici on ne peut pas retourner le père. racine← nœud; // insérer la racine
Sinon
Fonction Search_ABR(E/ racine: Pointeur , E/ val : Si (père↑.valeur>val) Alors //insérer le nœud
// comme fils gauche gauche
entier) : Pointeur
père↑.Fils_G← nœud ;
Début
Si (racine = Nil) Alors Sinon //insérer le nœud comme fils gauche droit
Search_ABR← Nil; //le cas particulier de la fonction père↑.Fils_D← nœud ;
// récursive Fsi ;
Sinon
Fsi ;
Si (racine↑.valeur = val) Alors //valeur dans la racine Fsi;
Search_ABR← racine; // un deuxième cas
// particulier pour la fonction récursive Fin;
Sinon
Si (racine↑.valeur<val) Alors //appel récursif Fonction 11 : Insertion dans une ABR (version
//pour chercher dans le sous-arbre gauche
récursive).
Search_ABR ←
Search_ABR(racine↑.Fils_G,val) ; Procédure Insert_ABR(ES/ racine: Pointeur , E/ val :
entier)
Sinon //appel récursif pour chercher dans le
//sous-arbre droit
Var nœud : Pointeur;
Search_ABR← Début
Search_ABR(racine↑.Fils_D,val) ; Si (racine=Nil) Alors //arbre vide → insérer la racine
Fsi ; nœud ← Créer_nœud(val) ;
Fsi ; racine← nœud ;
Fait; Sinon // on doit descendre jusqu’aux feuilles (Insertion se
Fin; // fait au niveau des feuilles uniquement

Si (racine↑.valeur>val) Alors //explorer le


// sous-arbre gauche
 Important : Dans une fonction récursive il est Si (racine↑.Fils_G = Nil) Alors //insérer la
strictement obligatoire de définir au moins un cas // valeur comme un fils gauche du nœud courant
particulier ( dans lequel la fonction retourne une valeur
bien définie et non pas un appel récursif). Cette nœud ← Créer_nœud(val) ;
contrainte n’est pas présente pour les procédures racine↑.Fils_G← nœud ;
récursives.
Sinon // insérer dans le sous-arbre gauche
Insert_ABR( racine↑.Fils_G , val) ;
Fsi ;
Fonctions d’insertion dans les arbres
binaires de recherche Sinon

Fonction 10 : Insertion dans une ABR (version Si (racine↑.valeur<val) Alors //explorer le


// sous-arbre droit
itérative).
Si (racine↑.Fils_D =Nil) Alors //insérer
Procédure Insert_ABR(ES/ racine: Pointeur , E/ val : // la valeur comme un fils droit
entier)
Var père : Pointeur; nœud ← Créer_nœud(val) ;
nœud : Pointeur; racine↑.Fils_D← nœud ;

Début Sinon // insérer dans le sous-arbre droit


Insert_ABR(racine↑.Fils_D , val);
Search_ABR(racine, val, nœud, père) ; // chercher la Fsi ;
// valeur et retourner son endroit pour l’insérer
//si elle n’existe pas
Fsi ;
Si (nœud<>Nil) Alors Fsi ;
Écrire(‘La valeur existe déjà’) ; Fait;
//////////////////////////////////////////////////////////////////////////////////////////////
Sinon // on doit insérer la valeur // Si la valeur existe déjà, elle ne sera pas insérée.
//////////////////////////////////////////////////////////////////////////////////////////////
nœud ← Créer_nœud(val) ; //Allocation d’un nœud.
Fin;

-- 3 --
BENADJIMI Noussaiba Révision sur les arbres Université d’Alger/2017

Exercices Supplémentaires Question 02 : (version récursif)


Fonction Nb_feuilles(E/ racine: Pointeur ):Entier
Exercice 01 Début
Soit un AB. //////////////////////////////////////////////////////////////////////////////////////
1. Donner une fonction pour trouver le nombre de nœuds // On suit le même principe que la question précédente //
d’un arbre binaire. // pour la version récursive et la version itérative //
2. Donner une fonction pour trouver le nombre de feuilles /////////////////////////////////////////////////////////////////////////////////////
d’un arbre binaire. Si racine =Nil Alors
3. Donner une fonction pour trouver le nombre de nœuds
Nb_feuilles ←0 ;
internes (non feuilles) d’un arbre binaire en utilisant
les questions 1 et 2.
Sinon
4. Donner une fonction pour trouver le nombre de nœuds Si racine↑.Fils_G=Nil ET racine↑.Fils_D=Nil Alors
internes d’un arbre binaire sans utiliser les questions 1 Nb_feuilles ←1;
et 2.
Sinon
Question 01 : (version récursif) Nb_ feuilles ←Nb_ feuilles (racine↑.Fils_G)+
Nb_ feuilles (racine↑.Fils_D) ;
Fonction Nb_noeud(E/ racine: Pointeur ): Entier
Fsi ;
Début
Fsi ;
Si racine =Nil Alors
Nb_nœud ←0 ; //le cas particulier : arbre vide Fin;
Sinon
Nb_nœud ←1+Nb_nœud (racine↑.Fils_G)+
Nb_nœud (racine↑.Fils_D) ; //appel récursif Question 02 : (version itératif)
Fsi ; Fonction Nb_feuilles(E/ racine: Pointeur ):Entier
Fin; Var nœud : Pointeur
pile : Pile de Pointeur
nb : Entier
Question 01 : (version itératif)
Début
Fonction Nb_nœud(E/ racine: Pointeur ):Entier
Var nœud : Pointeur Nouveau(pile) ;
pile : Pile de Pointeur nœud ← racine ;
nb : Entier nb ← 0 ;
Début TQ nœud <> Nil OU non Vide(pile) Faire
//////////////////////////////////////////////////////////////////
TQ nœud <> Nil Faire
// On suit le principe du parcours préfixe // Si nœud ↑.Fils_G=Nil ET nœud ↑.Fils_D=Nil
///////////////////////////////////////////////////////////////// Alors
nb++ ;
Nouveau(pile) ; Fsi ;
nœud ← racine ;
nb ← 0 ; // nombre des nœuds Empiler (pile, nœud ) ;
nœud ← nœud↑.Fils_G ;
TQ nœud <> Nil OU non Vide(pile) Faire
Fait ;
TQ nœud <> Nil Faire
nb++ ; // incrémenter le nombre des nœuds Dépiler (pile, nœud ) ;
Empiler (pile, nœud ) ; // descendre jusqu’à le nœud le nœud ← nœud↑.Fils_D ;
// plus à gauche du sous-arbre courant Fait;
nœud ← nœud↑.Fils_G ;
Fait ; Nb_feuilles← nb ;
Dépiler (pile, nœud ) ; // dépiler pour visiter le sous-arbre droit Fin;
nœud ← nœud↑.Fils_D ;
Fait;
Nb_nœud← nb ;
Fin;

-- 4 --
BENADJIMI Noussaiba Révision sur les arbres Université d’Alger/2017

Question 03 : Exercice 02
Fonction Nb_nœud_internes(racine: Pointeur ):Entier On dit qu’un arbre est filiforme si chaque nœud a au moins
Début un fils vide :
1. Écrire une fonction est_filiforme permettant de
Nb_nœud_internes ←Nb_nœud (racine) - vérifier si un arbre est filiforme.
Nb_feuilles(racine) ;
Fin; On dit qu’un arbre est un peigne gauche si le fils droit de
chaque nœud est vide. On défini de même les peignes droits.
2. Écrire une fonction Est_peigneG qui vérifie si un
Question 04 : (version récursive) arbre est peigne gauche.
3. Écrire une fonction peigneG qui retourne le peigne
Fonction Nb_nœud_internes(racine: Pointeur ):Entier
gauche des N premiers entiers. N donné.
Début
////////////////////////////////////////////////////////////////////////////////////// Question 01 : (version itératif)
// On suit le même principe que les questions 1 et 2 //
// pour la version récursive et la version itérative // Fonction Est_filiforme(racine: Pointeur ):Booléenne
//////////////////////////////////////////////////////////////////////////////////// Var nœud : Pointeur
pile : Pile de Pointeur
Si racine =Nil Alors filiforme : Booléenne
Nb_ nœud_internes ←0 ; Début
Sinon ////////////////////////////////////////////////////////////////////////////
Si racine↑.Fils_G<>Nil OU racine↑.Fils_D<>Nil // Idem, on suit le principe du parcours préfixe //
Alors ///////////////////////////////////////////////////////////////////////////
Nb_ nœud_internes ← 1+ Nouveau(pile) ;
Nb_ nœud_internes (racine↑.Fils_G)+ nœud ← racine ;
Nb_nœud_ internes (racine↑.Fils_D) ; filiforme ← vrai;
Sinon //la branche courante s’agit d’une seule feuille. TQ (nœud <> Nil OU non Vide(pile) )ET
Nb_nœud_ internes ←0 ; (filiforme=vrai) Faire
Fsi ;
TQ nœud <> Nil Faire
Fsi ;
Si nœud↑.Fils_G<> Nil ET
Fin;
nœud↑.Fils_D <> Nil Alors
Question 01 : (version itératif) filiforme← faux;
Fonction Nb_nœud_internes(E/ racine: Pointeur ):Entier Fsi ;
Var nœud : Pointeur Empiler (pile, nœud ) ;
pile : Pile de Pointeur nœud ← nœud↑.Fils_G ;
nb : Entier
Début Fait ;
Nouveau(pile) ; Dépiler (pile, nœud ) ;
nœud ← racine ; nœud ← nœud↑.Fils_D ;
nb ← 0 ;
Fait;
TQ nœud <> Nil OU non Vide(pile) Faire
Est_filiforme← filiforme ;
TQ nœud <> Nil Faire
Si nœud ↑.Fils_G <>Nil OU nœud ↑.Fils_D<>Nil Fin;
Alors
nb++ ;
Fsi ;
Empiler (pile, nœud ) ;
nœud ← nœud↑.Fils_G ;
Fait ;
Dépiler (pile, nœud ) ;
nœud ← nœud↑.Fils_D ;
Fait;
Nb_nœud← nb ;
Fin;

-- 5 --
BENADJIMI Noussaiba Révision sur les arbres Université d’Alger/2017

Question 01 : (version récursive) Question 03 : (version itératif)


Fonction Est_filiforme(racine: Pointeur ): Booléenne Fonction peigneG (E/ N: Entier ): Pointeur
Début Var i : Entier
père, nœud : Pointeur
Si ( racine<>Nil) Alors Début
SI (racine↑.Fils_G <> Nil ET racine↑.Fils_D <> Nil ) i←1;
Alors père← Nil ; racine← Nil
Est_filiforme← faux ; // le cas particulier TQ (i<=N) Alors
Sinon // vérifier la branche non vide nœud← Créer_nœud(i) ;
Si père<>Nil
SI (racine↑.Fils_G <> Nil)
Est_filiforme← Est_filiforme(nœud↑.Fils_G)
père↑.Fils_G← nœud ; // insérer le nœud comme fils
// gauche
Sinon Sinon
racine← nœud ; // arbre vide → insérer la racine
SI (racine↑.Fils_D <> Nil)
Fsi ;
Est_filiforme← Est_filiforme(nœud↑.Fils_D)
père← nœud ; // avancer le père
Sinon // racine↑.Fils_G=Nil ET racine↑.Fils_D=Nil i++ ;
Est_filiforme← vrai ; // j’ai arrivé à la fin de l’arbre
// sans problème → un deuxième cas particulier Fait;
Fsi ; Fin ;
Fsi ;
Fsi ;
Exercice 03
Sinon
Écrire une fonction qui étant données racien un ABR et val
Est_filiforme← vrai; // arbre vide
un entier, retourne un ABR qui ne contient que les éléments
Fsi ; de racine inférieur ou égal à val.
Contrainte :
Fin ; L’algorithme ne doit pas comparer tout les nœuds à val.

Question 01 : (version récursive)


Question 02 : (version récursive) Fonction arb_inf(E/racine:Pointeur, val:Entier):
Fonction Est_peigneG (racine: Pointeur ): Booléenne Pointeur
Début Var nœud, racine2: Pointeur
//////////////////////////////////////////////////////////////////////////////////////
Début
// On suit le même principe que Est_filiforme // nœud ← racine; racine2← Nil ;
///////////////////////////////////////////////////////////////////////////////////// TQ (nœud <> Nil OU non Vide(pile) )Faire
Si ( racine<>Nil) Alors TQ nœud <> Nil Faire
Si nœud↑.valeur > val Alors // ne pas visiter le sous
SI (racine↑.Fils_D <> Nil ) Alors // arbre droit (tous les nœuds sont supérieur à val) →
Est_peigneG← faux ; // passer au fils gauche sans empiler le nœud courant.
Sinon nœud ← nœud↑.Fils_G ;
SI (racine↑.Fils_G <> Nil) Sinon; // on doit visiter le sous arbre droit (il se peut
// qu’il y aura des nœuds inférieur à val) → empiler
Est_peigneG← Est_peigneG(nœud↑.Fils_G) ; // et insérer le nœud ensuite passer au fils gauche
Sinon
SI (racine↑.Fils_G=Nil) Empiler (pile, nœud ) ;
Est_peigneG← vari ; Insert_ABR(racine2, nœud↑.valeur) ;
Fsi ; nœud ← nœud↑.Fils_G ;
Fsi ; Fsi ;
Fsi ;
Fait ;
Sinon
Est_peigneG← vrai; // arbre vide Dépiler (pile, nœud ) ;
Fsi ; nœud ← nœud↑.Fils_D ;
Fin ; Fait;
arb_inf← racine2 ;
Fin;

-- 6 --
BENADJIMI Noussaiba Révision sur les arbres Université d’Alger/2017

Exercice 04 Si nœud↑.Fils_G=Nil ET racine↑.Fils_D=Nil


Soit un AB représentant une opération arithmétique. Alors // feuille comme fils droit
1. Écrivez une fonction qui affiche l’arbre sous forme Écrire (‘)’) ;
agréable (Voir l’exemple). Dépiler (pile, nœud ) ; // dépiler une autre fois
2. Écrire une fonction qui calcule la valeur associée à nœud ← nœud↑.Fils_D ;
l’arbre.
Fsi ;
père← nœud ; // réinitialiser le père
→ (3*((5+1)/2)); Fait;
→ valeur associée=09 Fin;

Question 2 :
Fonction Calculer_expr(E/ racine: Pointeur ) : Entier
Question 01: version récursive Début
Procédure Aff_expr(E/ racine: Pointeur )
Début /////////////////////////////////////////////////////////////////////////////////////////////////////
// Soient la fonction suivante permettant d’évaluer une expression
Si (racine <>Nil)Alors // Evaluer(op1, operateur, op2) : retourne un entier
// représentant la valeur de op1 operateur op2 :
Si racine↑.Fils_G=Nil ET racine↑.Fils_D=Nil Alors // exemple : Evaluer(5,+,2)=7
Écrire (racine↑.valeur) ; //feuille → opérant /////////////////////////////////////////////////////////////////////////////////////////////////////
Sinon //nœud interne → opérateur
Si (racine <>Nil) Alors
Écrire (‘(’) ;
Aff_expr (racine↑.Fils_G) ; //explorer le sous-arbre gauche. Si racine↑.Fils_G=Nil ET racine↑.Fils_D=Nil Alors
Écrire (racine↑.valeur) ; // afficher l’opérateur Calculer_expr← racine↑.valeur; // feuille :
Aff_expr (racine↑.Fils_D) ; //explorer le sous-arbre droit Sinon
Écrire (‘)’) ; Calculer_expr←
Fsi ; Evaluer (Calculer_expr(racine↑.Fils_G),
Fsi ; racine↑.valeur,
Fin; Calculer_expr (racine↑.Fils_D)) ;
Fsi ;
Sinon
Question 01: Version Itérative Calculer_expr← 0 ; // on doit traiter ce cas car c’est une
Procédure Aff_expr(E/ racine: Pointeur ) // fonction donc on doit retourner une valeur dans tous les cas
Var père : Pointeur; Fsi ;
nœud : Pointeur; Fin;
pile : pile de Pointeur;
Début
nœud ← racine;
père←Nil ; //pour vérifier s’il s’agit d’un sous-arbre droit
Exercice 07
TQ (nœud <> Nil OU non Vide(pile) )Faire Soit un ABR.
TQ nœud <> Nil Faire 1. Écrire une fonction qui permet de retrouver le
Empiler (pile, nœud ) ; // descendre jusqu’ minimum.
père← nœud ; // mis à jour du père à chaque empilement 2. Écrire une fonction qui permet de retrouver le
maximum.
nœud ← nœud↑.Fils_G ; 3. Écrire une fonction qui permet de retrouver le
Fait ; successeur d’un nœud à partir de la méthode
minimum.
Si père↑.Fils_G=Nil ET père↑.Fils_D=Nil Alors 4. Écrire une fonction qui permet de retrouver le
prédécesseur d’un nœud à partir de la méthode
Écrire (‘(’) ; //feuille comme fils gauche
maximum.
Fsi ;

Écrire (racine↑.valeur) ; //afficher la valeur :opérant ou


// opérateur
Dépiler (pile, nœud ) ; // pour visiter le sous-arbre droit
nœud ← nœud↑.Fils_D ;

-- 7 --
BENADJIMI Noussaiba Révision sur les arbres Université d’Alger/2017

Question 01 : (version itératif) Question 03 : (version itératif)


Fonction Min_ABR (E/ racine: Pointeur) : Pointeur Fonction Succ_ABR (racine: Pointeur, val) : Pointeur
Var nœud : Pointeur Var nœud : Pointeur
Début Début
//////////////////////////////////////////////////////////////// nœud ← Search_ABR( racine,val);
// Il s’agit du nœud le plus à gauche // Si (nœud<>Nil) Alors // le min de sous-arbre droit
////////////////////////////////////////////////////////////////
Succ_ABR ← Min_ABR (nœud↑.Fils_D);
Si (racine <>Nil) Alors Sinon
nœud ← racine ;
TQ (nœud<>Nil) Alors Si (val<Min_ABR (racine)) Alors
Si nœud↑.Fils_G=Nil Alors // le nœud le plus à gauche Succ_ABR ← Min_ABR (racine);
Sinon
Min_ABR ← nœud ;
Fsi ; Si (nœud↑.valeur>Max_ABR (racine)) Alors
nœud ← nœud↑.Fils_G; // n’explorer que les branches Succ_ABR ←Nil;
// gauches
Sinon // chercher l’emplacement d’insertion de val
// comme si on veut insérer la valeur
Fait;
nœud← racine ;
Sinon
TQ (nœud↑.valeur>val) Alors
Min_ABR ← Nil;
Fsi ; nœud ←nœud↑.Fils_D
Fsi ;
Fin ; Succ_ABR ← Min_ABR (nœud↑.Fils_D);
Fsi ;
Question 02 : (version itératif) Fsi ;
Fonction Max_ABR (E/ racine: Pointeur) : Pointeur Fsi ;
Var nœud : Pointeur Fin ;
Début
////////////////////////////////////////////////////////////////
// Il s’agit du nœud le plus à droit // Question 04 : (version itératif)
//////////////////////////////////////////////////////////////// Fonction Pre_ABR (racine: Pointeur, val) : Pointeur
Var nœud : Pointeur
Si (racine <>Nil) Alors
Début
nœud ← racine ;
nœud ← Search_ABR( racine,val);
TQ (nœud<>Nil) Alors
Si (nœud<>Nil) Alors // le min de sous-arbre gauche
Si nœud↑.Fils_D=Nil Alors // le nœud le plus à droite
Pre_ABR ← Max_ABR (nœud↑.Fils_G);
Max_ABR ← nœud ;
Fsi ; Sinon
nœud ← nœud↑.Fils_D; // n’explorer que les branches
Si (val>Max_ABR (racine)) Alors
// droites
Pre_ABR ← Max_ABR (racine);
Fait;
Sinon
Sinon
Max_ABR ← Nil; Si (nœud↑.valeur<Max_ABR (racine)) Alors
Fsi ; Pre_ABR ←Nil;
Fin ; Sinon // chercher l’emplacement d’insertion de val
// comme si on veut insérer la valeur
nœud← racine ;
TQ (nœud↑.valeur<val) Alors
nœud ←nœud↑.Fils_G
Fsi ;
Pre_ABR ← Max_ABR (nœud↑.Fils_G);
Fsi ;
Fsi ;
Fsi ;
Fin ;

Bon courage :)

-- 8 --

Vous aimerez peut-être aussi