Académique Documents
Professionnel Documents
Culture Documents
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 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
-- 3 --
BENADJIMI Noussaiba Révision sur les arbres Université d’Alger/2017
-- 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
-- 6 --
BENADJIMI Noussaiba Révision sur les arbres Université d’Alger/2017
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 ;
-- 7 --
BENADJIMI Noussaiba Révision sur les arbres Université d’Alger/2017
Bon courage :)
-- 8 --