Algo Arbre Parcours

Identification

Infoforall

15 - Parcours en profondeur d'abord (AB)


Nous allons voir aujourd'hui à quel point l'Arbre est une structure récursive.

Vous allez découvrir trois premières façons d'explorer un arbre noeud par noeud.

Logiciel nécessaire pour l'activité : -

Prérequis : Données : Arbre et Arbre Binaire

Evaluation ✎ :

Documents de cours : open document ou pdf

1 - Arbre Binaire

Nous allons représenter nos Arbres Binaires comme une structure qui est vide ou composée de noeuds reliés entre eux.

(Rappel) 1.1 L'idée générale (1er partie de la définition de l'arbre binaire)

A - Description

Un arbre binaire est composé

  • soit d'un arbre binaire VIDE
  • soit d'un arbre binaire NON VIDE composé d'un noeud menant à deux sous-arbres
    • le sous-arbre binaire gauche peut être un arbre binaire VIDE ou un arbre binaire NON VIDE
    • le sous-arbre binaire droite peut être un arbre binaire VIDE ou un arbre binaire NON VIDE

Il existe deux différences majeures entre les arbres enracinés et les arbres binaires :

  1. L'arbre binaire peut être VIDE, alors qu'un arbre enraciné possède au moins un noeud-racine.
  2. un arbre binaire n'est pas juste un arbre où chaque noeud peut avoir deux fils au maximum. Le positionnement à gauche ou à droite doit suivre une logique interne de positionnement, ce n'est pas un choix aléatoire. Dans le cas d'un arbre généalogique, on pourrait ainsi placer le père à gauche et la mère à droite dans tout l'arbre binaire. Ou faire le choix inverse, mais dans tout l'arbre.

On symbolise parfois l'arbre vide par un symbole particulier sur les arbres binaires. Ci-dessous, c'est un petit carré jaune.

B - Exemple

Ci-dessous, vous trouverez deux arbres binaires différents :

Arbre binaire Arbre binaire

Ces arbres binaires ne sont pas identiques car le fils-gauche de C est B sur le premier mais le fils gauche de C est G sur le deuxième.

S'il s'agissait de deux arbres enracinés, il s'agirait par contre du même arbre. Il serait simplement représenté de deux façons différentes.

(Rappel) 1.2 Les primitives (2e partie de la définition de l'arbre binaire)

Je le décris ici sous forme d'un type immuable, mais on pourait faire la même chose en muable.

  1. nvABV() -> Arbre Binaire VIDE
  2. Crée un nouvel ARBRE BINAIRE vide.
    On le note ainsi pour dire nouvelArbreBinaireVide() mais c'est plus long.

  3. nvAB(v:Element, g:Arbre Binaire, d:Arbre Binaire) -> Arbre Binaire NON VIDE
  4. Crée un nouvel ARBRE BINAIRE dont la racine porte la valeur v et mène aux sous-arbres transmis à la fonction, g et d.

  5. estABV(arbre:Arbre Binaire) -> bool
  6. Prédicat qui renvoie True si l'arbre est un arbre binaire vide.

  7. racine(arbre:Arbre Binaire NON VIDE) -> Noeud
  8. Renvoie le noeud jouant le rôle de la racine pour cet arbre binaire NON VIDE.

  9. contenu(noeud:Noeud) -> Element
  10. Renvoie l'élément rattaché au noeud transmis.

  11. gauche(arbre:Arbre Binaire NON VIDE) -> Arbre Binaire
  12. Renvoie le sous-arbre gauche de arbre. On obtient bien un Arbre. Si vous voulez le noeud gauche, il faudra appliquer en plus la fonction racine().

  13. droite(arbre:Arbre Binaire NON VIDE) -> Arbre Binaire
  14. Renvoie le sous-arbre droite de arbre.

Nous allons voir maintenant les 3 modes de parcours en profondeur (en profondeur car on s'enfonce rapidement plutôt que de tester tout l'étage où on se trouve).

  1. Préfixe : on lit d'abord la Racine ([R]GD)
  2. Suffixe ou postfixe : on lit la Racine à la fin (GD[R])
  3. Infixe : on lit la Racine au milieu de la séquence (G[R]D), infixe comme intérieur.

2 - Parcours Préfixe : [R] G D

Voici comment on réalise un parcours en profondeur préfixe de façon récursive dans un Arbre Binaire.

2.1 Parcours PREFIXE : [R]GD

Principe et exemple du PREFIXE

Préfixe veut dire qu'on explore d'abord la Racine de l'arbre en cours avant d'aller voir à Gauche et à Droite.

Séquence [R]GD.

  1. [R] : d'abord, on visite() le noeud actuel (la racine de l'arbre en cours donc);
  2. G : ensuite on explore le sous-arbre gauche;
  3. D : enfin on explore le sous-arbre droite.

La fonction visiter() reste à définir : il peut s'agir d'un simple affichage de l'étiquette, même si cela ne sert pas à grand chose.

Animation du parcours en profondeur préfixe RGD
CLIQUER SUR L'IMAGE pour ANIMER ou STOPPER
ORDRE GAUCHE-DROITE

On notera qu'on peut également parler de parcours en profondeur préfixe en explorant RACINE puis DROITE puis GAUCHE.

Le tout est de préciser clairement comment vous explorez et de garder le même ordre tout le long de l'exploration.

2.2 Algo Parcours PREFIXE d'Arbre NON VIDE

Il existe deux versions de l'algorithme : dans la première la précondition est que l'arbre soit NON VIDE, dans la deuxième version, il peut être vide ou pas.

Descriptions des ENTREES / SORTIE
  • ENTREE : Un Arbre Binaire
    • Précondition : NON VIDE
  • SORTIE : Rien sur l'exemple, simple fonction d'affichage. Mais on pourrait les stocker dans un tableau et renvoyer le tableau.
Description de l'ALGORITHME avec précondition

Description de parcourir(arbre: Arbre Binaire NON VIDE)

    visiter(racine(arbre))

    SI NON estABV(gauche(arbre))

      parcourir(gauche(arbre))

    Fin SI

    SI NON estABV(droite(arbre))

      parcourir(droite(arbre))

    Fin SI

    Renvoyer VIDE

Note importante pour éviter une erreur bête

Il s'agit ici de SI (NON condition) et pas d'un SINON SI (condition).

2.3 Algo Parcours PREFIXE d'Arbre sans précondition

Il existe deux versions de l'algorithme : dans la première la précondition est que l'arbre soit NON VIDE, dans la deuxième version, il peut être vide ou pas.

Description des ENTREES et SORTIE
  • ENTREE : Un Arbre Binaire
  • SORTIE : Rien sur l'exemple, simple fonction d'affichage. Mais on pourrait les stocker dans un tableau et renvoyer le tableau.
Description de l'ALGORITHME (sans précondition)

Description de parcourir(arbre: Arbre Binaire)

    SI NON estABV(arbre)

      visiter(racine(arbre))

      parcourir(gauche(arbre))

      parcourir(droite(arbre))

    Fin SI

    Renvoyer VIDE

Note importante pour éviter une erreur bête

Il s'agit ici de SI (NON condition) et pas d'un SINON SI (condition).

01° Appliquer cet algorithme à l'Arbre Binaire ci-dessous en considérant que la fonction visiter() affiche simplement le résultat dans une interface imaginaire.

Arbre question 10

...CORRECTION DETAILLEE...

On commence par la racine :

Arbre question 1

Ensuite, on part dans le sous-arbre Gauche :

Arbre question 1

On y lit la racine :

Arbre question 1

On part dans le sous-arbre Gauche :

Arbre question 1

On part dans le sous-arbre Droit :

Arbre question 1

On part dans le sous-arbre Droit initial:

Arbre question 1

On lit la racine :

Arbre question 1

On explore à gauche(vide) puis à droite :

Arbre question 1

02° Appliquer cet algorithme à l'Arbre Binaire ci-dessous en considérant que la fonction visiter() affiche simplement le résultat dans une interface imaginaire.

Arbre question 16

...CORRECTION...

Animation du parcours en profondeur préfixe RGD
CLIQUER SUR L'IMAGE pour ANIMER ou STOPPER

03° Appliquer cet algorithme à l'Arbre Binaire ci-dessous en considérant que la fonction visiter affiche simplement le résultat dans une interface imaginaire.

Arbre question 18

...CORRECTION...

Animation du parcours en profondeur préfixe RGD
CLIQUER SUR L'IMAGE pour ANIMER ou STOPPER

04° Appliquer cet algorithme à l'Arbre Binaire ci-dessous en considérant que la fonction visiter() affiche simplement le résultat dans une interface imaginaire.

Arbre question 18

...CORRECTION...

Arbre question 4

05° Fournir les deux versions de l'algorithme sans regarder votre cours.

  1. La version avec un arbre binaire NON VIDE en entrée
  2. La version avec simplement un arbre binaire (quelconque) en entrée

...CORRECTION...

.

3 - Parcours suffixe (ou postfixe) : G D [R]

Voici comment on réalise un parcours en profondeur suffixe de façon récursive dans un Arbre Binaire.

3.1 Parcours SUFFIXE / POSTFIXE : GD[R]

Principe et exemple du PREFIXE ou POSTFIXE

Suffixe veut dire qu'on explore la Racine de l'arbre en cours après avoir explorer Gauche et à Droite.

Séquence GD[R].

  1. G : d'abord on explore le sous-arbre gauche;
  2. D : puis on explore le sous-arbre droite;
  3. R : enfin, on visite() le noeud actuel (la racine de l'arbre en cours).

La fonction visiter() reste à définir.

Animation du parcours en profondeur suffixe GDR
CLIQUER SUR L'IMAGE pour ANIMER ou STOPPER
ORDRE GAUCHE-DROITE

On notera qu'on peut également parler de parcours en profondeur suffixe en explorant RACINE puis DROITE puis GAUCHE.

Le tout est de préciser clairement comment vous explorez et de garder le même ordre tout le long de l'exploration.

On peut donc considérer DG[R] plutôt que GD[R].

3.2 Algo Parcours SUFFIXE-POSTFIXE d'Arbre NON VIDE

Il existe deux versions de l'algorithme : dans la première la précondition est que l'arbre soit NON VIDE, dans la deuxième version, il peut être vide ou pas.

Descriptions des ENTREES / SORTIE
  • ENTREE : Un Arbre Binaire
    • Précondition : NON VIDE
  • SORTIE : Rien sur l'exemple, simple fonction d'affichage. Mais on pourrait les stocker dans un tableau et renvoyer le tableau.
Description de l'ALGORITHME avec précondition

Description de parcourir(arbre: Arbre Binaire NON VIDE)

    SI NON estABV(gauche(arbre))

      parcourir(gauche(arbre))

    Fin SI

    SI NON estABV(droite(arbre))

      parcourir(droite(arbre))

    Fin SI

    visiter(racine(arbre))

    Renvoyer VIDE

Note importante pour éviter une erreur bête

Il s'agit ici de SI (NON condition) et pas d'un SINON SI (condition).

3.3 Algo Parcours SUFFIXE - POSTFIXE d'Arbre sans précondition

Il existe deux versions de l'algorithme : dans la première la précondition est que l'arbre soit NON VIDE, dans la deuxième version, il peut être vide ou pas.

Description des ENTREES et SORTIE
  • ENTREE : Un Arbre Binaire
  • SORTIE : Rien sur l'exemple.
Description de l'ALGORITHME (sans précondition)

Description de parcourir(arbre: Arbre Binaire)

    SI NON estABV(arbre)

      parcourir(gauche(arbre))

      parcourir(droite(arbre))

      visiter(racine(arbre))

    Fin SI

    Renvoyer VIDE

Note importante pour éviter une erreur bête

Il s'agit ici de SI (NON condition) et pas d'un SINON SI (condition).

06° Appliquer cet algorithme à l'Arbre Binaire ci-dessous en considérant que la fonction visiter() affiche simplement le résultat dans une interface imaginaire.

Arbre question 10

...CORRECTION...

Arbre question 6

...CORRECTION DETAILLEE...

On commence par le sous-arbre gauche :

Arbre question 1

On y cherche le sous-arbre Gauche :

Arbre question 1

On part dans le sous-arbre Droit :

Arbre question 1

On y lit la racine :

Arbre question 1

On part dans le sous-arbre droit initial :

Arbre question 1

On lit le sous-arbre Gauche vide puis le sous-arbre Droit :

Arbre question 1

On lit la racine :

Arbre question 1

On lit la racine :

Arbre question 1

07° Appliquer cet algorithme à l'Arbre Binaire ci-dessous en considérant que la fonction visiter() affiche simplement le résultat dans une interface imaginaire.

Arbre question 16

...CORRECTION...

Arbre question 7

08° Appliquer cet algorithme à l'Arbre Binaire ci-dessous en considérant que la fonction visiter() affiche simplement le résultat dans une interface imaginaire.

Arbre question 18

...CORRECTION...

Arbre question 8

09° Appliquer cet algorithme à l'Arbre Binaire ci-dessous en considérant que la fonction visiter() affiche simplement le résultat dans une interface imaginaire.

Arbre question 18

...CORRECTION...

Arbre question 9

10° Retrouver les deux versions de l'algorithme.

...CORRECTION...

.

4 - Parcours infixe : G [R] D

Voici comment on réalise un parcours en profondeur infixe de façon récursive dans un Arbre Binaire.

4.1 Parcours INFIXE : G[R]D

Principe du INFIXE

Infixe veut dire qu'on explore la racine au milieu du parcours.

Séquence G[R]D.

  1. G : D'abord on explore le sous-arbre gauche;
  2. [R] : ensuite, on visite() le noeud actuel (la racine de l'arbre en cours donc);
  3. D : enfin on explore le sous-arbre droite.

La fonction visiter() reste à définir.

ORDRE GAUCHE-DROITE

On notera qu'on peut également parler de parcours en profondeur infixe en explorant RACINE puis DROITE puis GAUCHE.

Le tout est de préciser clairement comment vous explorez et de garder le même ordre tout le long de l'exploration.

4.2 Algo Parcours INFIXE d'Arbre NON VIDE

Il existe deux versions de l'algorithme : dans la première la précondition est que l'arbre soit NON VIDE, dans la deuxième version, il peut être vide ou pas.

Descriptions des ENTREES / SORTIE
  • ENTREE : Un Arbre Binaire
    • Précondition : NON VIDE
  • SORTIE : Rien sur l'exemple.
Description de l'ALGORITHME avec précondition

Description de parcourir(arbre: Arbre Binaire NON VIDE)

    SI NON estABV(gauche(arbre))

      parcourir(gauche(arbre))

    Fin SI

    visiter(racine(arbre))

    SI NON estABV(droite(arbre))

      parcourir(droite(arbre))

    Fin SI

    Renvoyer VIDE

Note importante pour éviter une erreur bête

Il s'agit ici de SI (NON condition) et pas d'un SINON SI (condition).

4.3 Algo Parcours SUFFIXE - POSTFIXE d'Arbre sans précondition

Il existe deux versions de l'algorithme : dans la première la précondition est que l'arbre soit NON VIDE, dans la deuxième version, il peut être vide ou pas.

Description des ENTREES et SORTIE
  • ENTREE : Un Arbre Binaire
  • SORTIE : Rien sur l'exemple.
Description de l'ALGORITHME (sans précondition)

Description de parcourir(arbre: Arbre Binaire)

    SI NON estABV(arbre)

      parcourir(gauche(arbre))

      visiter(racine(arbre))

      parcourir(droite(arbre))

    Fin SI

    Renvoyer VIDE

Note importante pour éviter une erreur bête

Il s'agit ici de SI (NON condition) et pas d'un SINON SI (condition).

11° Appliquer cet algorithme à l'Arbre Binaire ci-dessous en considérant que la fonction visiter() affiche simplement le résultat dans une interface imaginaire.

Arbre question 11

...CORRECTION...

G C B A E F

Arbre question 1

...CORRECTION DETAILLEE...

On commence par le sous-arbre gauche :

Arbre question 1

On y cherche le sous-arbre Gauche :

Arbre question 1

On y lit la racine :

Arbre question 1

On part dans le sous-arbre Droit :

Arbre question 1

On revient à la racine :

Arbre question 1

On part dans le sous-arbre Droit initial:

Arbre question 1

On lit le sous-arbre Gauche vide puis la racine :

Arbre question 1

On explore à droite :

Arbre question 1

12° Appliquer cet algorithme à l'Arbre Binaire ci-dessous en considérant que la fonction visiter() affiche simplement le résultat dans une interface imaginaire.

Arbre question 16

...CORRECTION...

D B E A F C G

Arbre question 12

13° Appliquer cet algorithme à l'Arbre Binaire ci-dessous en considérant que la fonction visiter() affiche simplement le résultat dans une interface imaginaire.

Arbre question 18

...CORRECTION...

E D C G F B A

Arbre question 13

14° Appliquer cet algorithme à l'Arbre Binaire ci-dessous en considérant que la fonction visiter() affiche simplement le résultat dans une interface imaginaire.

Arbre question 18

...CORRECTION...

G H C B A E D F

Arbre question 14

Après ces versions récursives des parcours, nous allons réaliser les versions itératives.

Et pour cela, nous allons devoir associer nos arbres à des piles.

15° Comment créer une pile, empiler, dépiler, tester si la pile est vide et lire le sommet rapidement en Python ?

...CORRECTION...

.

16° Ecrire les trois fonctions de parcours en version itérative. Votre fonction devra être documentée et devra afficher les noeuds traités. Le seul paramètre de votre fonction sera l'arbre qu'on désire parcourir.

...CORRECTION...

.

17° Modifier vos fonctions : elles doivent maintenant renvoyer un tableau contenant la liste des noeuds rencontrés pendant le parcours.

...CORRECTION...

.

5 - Arbre d'une formule

Arbre représentant une formule : exemple 1

L'une des utilisations typiques des arbres est celle de la représentation d'une formule logique ou arithmétique.

La racine de l'Arbre est alors l'opérateur utilisé (dans le cas d'Arbre Binaire, il ne s'agit que d'opérateurs à deux paramètres).

Un exemple ? Voici comment on peut représenter 5*4 :

Arbre de la formule 5*4
  • La racine est l'opérateur binaire à utiliser : la multiplication.
  • Les deux sous-arbres font référence au terme de gauche (5 ici) et au terme de droite (4 ici).

Que donne le parcours en profondeur de cet arbre binaire basique ?

  • 5 * 4 en infixe (on retrouve la notation que vous connaissez, celle avec l'opérateur au milieu des arguments)
  • * 5 4 en préfixe (on appelle cela la notation polonaise car son utilisation est due à Jan Łukasiewicz).
  • 5 4 * en postfixe (on appelle cela la notation polonaise inverse)
Arbre représentant une formule : exemple 2

Plus compliqué :

Arbre de la formule (6+4)*(2*3)

Cette fois, la formule est (6+4) * (2*3).

Voici les 3 parcours :

  • 6 + 4 * 2 * 3 en infixe.
  • On voit bien que sans les parenthèses, il est difficile en lisant cet arbre en infixe de retrouver la formule encodée : est-ce (6+4)*(2*3) ou (6+(4*2)*3) ou encore autre chose ?

  • * + 6 4 * 2 3 en préfixe
  • Cette fois, pas besoin de parenthèses pour retrouver la formule : il suffit de savoir que les opérateurs utilisés sont tous des opérateurs binaires.

    On trouve d'abord un opérateur binaire *. Il doit y avoir les deux termes derrière.

    Le premier terme commence par un +, un opérateur binaire. On doit donc trouver ses deux termes derrière.

    * (+ 6 4) * 2 3

    On trouve ensuite un opérateur binaire + qui devrait être suivi de ses deux termes.

    * (+ 6 4) (* 2 3)

    L'opérateur central est donc la multiplication et on obtient

    (6+4) * (2*3)

  • 6 4 + 2 3 * * en postfixe
  • Même principe que précédemment mais... à l'envers.

    On commence par 6 et 4, les deux termes nécessaires pour l'opérateur +.

    (6 4 +) 2 3 * *

    On trouve ensuite un 2 et un 3 dont l'opérateur est * :

    (6 4 +) (2 3 *) *

    On peut en déduire que les deux termes entre parenthèses sont reliés par la multiplication finale.

18° Retrouver la formule dont le parcours préfixe donne ceci :

+ 4 * 2 10

...CORRECTION...

+ 4 * 2 10

Opérateur + menant à un terme 4 et un autre terme qui commence par l'opérateur *.

Cet opérateur * est suivi de ces deux termes : 2 et 10.

+ 4 (* 2 10)

On en déduit que la formule est 4 + (2*10).

19° Retrouver la formule dont le parcours préfixe donne ceci :

/ * 2 10 - 8 6

...CORRECTION...

/ * 2 10 - 8 6

Opérateur / menant à un premier terme qui commence par l'opérateur *.

Cet opérateur * est suivi de ces deux termes : 2 et 10.

/ (* 2 10) - 8 6

On trouve ensuite le deuxième terme qui commence par - et des deux termes 8 et 6.

/ (* 2 10) (- 8 6)

La formule est donc (2*10) / (8-6)

20° Fournir les trois parcours de la formule logique dont l'Arbre est fourni ci-dessous.

Arbre logique

...CORRECTION...

Pour conclure, j'ai pris juste au dessus un exemple très calculatoire de l'utilisation des arbres. Mais on peut également trouver de très nombreux exemples issus plus directement de la logique. Voici comment on peut représenter une démonstration ou une réflexion en informatique ou en logique mathématique. Cela devrait, peut-être, vous rappeler d'autres cours de Terminale : la flèche est ici le symbole de l'implication.

Je doute implique je pense implique je suis

Au début de la IVe partie du discours, Descartes rencontre un premier principe de vérité : le fait que le sujet applique l’instrument du doute à sa propre existence, prouve paradoxalement son existence. Si « je » doute, il faut bien que « je » pense. On arrive alors à cette conclusion : "Je pense, donc je suis".

  • Première réflexion : "Je doute" "Je pense"
  • Deuxième réflexion : "Je pense" "Je suis"
  • Au total : "Je doute" "Je pense" "Je suis"
On notera qu'il est dangereux d'appliquer la logique mathématique et informatique à des propositions qui ne sont pas des objets mathématique ou informatique. Ici, je le fais juste pour vous montrer qu'on peut formaliser des choses que vous pensiez peut-être difficilement formalisable sous forme informatique. Mais mélanger les notions non-mathématiques à la logique est souvent source de mauvaise interprétation. Attention.
Table de vérité de l'implication

Nous avons déjà rencontré l'implication lors de l'activité sur les fonctions :

  • TYPES et PRECONDITIONS valides permet de garantir que la POSTCONDITION est valide.
  • TYPES et PRECONDITONS invalides permet de garantir... rien. La POST CONDITION peut être valide, ou pas. On n'en sait rien.
Expression a
(Preconditions ?)
Expression b
(Postcondition ?)
a b Pourquoi ?
FAUX FAUX VRAI Si les préconditions donnent FAUX,
la postcondition peut être FAUX,
donc A IMPLIQUE B est VRAI sur cette ligne.
FAUX VRAI VRAI Si les préconditions donnent FAUX,
la postcondition peut être VRAI,
donc A IMPLIQUE B est VRAI sur cette ligne.
VRAI FAUX FAUX Si les préconditions donnent VRAI,
la postcondition doit être VRAI,
donc A IMPLIQUE B est FAUX sur cette ligne.
VRAI VRAI VRAI Si les préconditions donnent VRAI,
la postcondition doit être VRAI,
donc A IMPLIQUE B est VRAI sur cette ligne.

6 - Bilan

6.1 Parcours en profondeur d'abord d'un arbre binaire

Principe

Le principe est d'explorer chaque arbre non vide au niveau de la racine, du sous-arbre gauche et du sous-arbre droit.

  • Ordre [R]-G-D : parcours préfixe, racine d'abord (notation polonaise)
  • Ordre G-[R]-D : parcours infixe, racine au milieu (notation classique)
  • Ordre G-D-[R] : parcours suffixe/postfixe, racine à la fin (notation polonaise inverse)
Traduction
  • Parcours profondeur d'abord --> DFS, pour Depth-First Search
  • Arbre Binaire --> Binary Tree
  • Noeud --> Node
  • Arête --> Edge
  • Prefixe --> preordering
  • Suffixe --> postordering
  • Infixe --> inordering
  • 6.2 Parcours en profondeur d'abord, version récursive

    Description de l'ALGORITHME (sans précondition) (ici prefixe RGD)

    Description de parcourir(arbre: Arbre Binaire)

      SI NON estABV(arbre)

        visiter(racine(arbre))

        parcourir(gauche(arbre))

        parcourir(droite(arbre))

      Fin SI

      Renvoyer VIDE

    Seul l'ordre des 3 blocs changent dans les 3 versions.

    Description de l'ALGORITHME avec précondition

    Description de parcourir(arbre: Arbre Binaire NON VIDE)

      visiter(racine(arbre))

      SI NON estABV(gauche(arbre))

        parcourir(gauche(arbre))

      Fin SI


      SI NON estABV(droite(arbre))

        parcourir(droite(arbre))

      Fin SI

      Renvoyer VIDE

    6.3 Parcours en profondeur d'abord, version itérative

    On remplace la pile d'appels par une vraie pile.

    Description de l'ALGORITHME (sans précondition) (ici prefixe RGD)

    Description de parcourir(arbre: Arbre Binaire)

      SI NON estABV(arbre)

        p nouvellePileVide()

        empiler(p, arbre)

        TANT QUE NON estPileVide(p)

          a depiler(p)

          visiter(racine(a))

          SI NON estABV(droite(a))

            empiler(p, droite(a))

          Fin SI


          SI NON estABV(gauche(a))

            empiler(p, gauche(a))

          Fin SI

        Fin TANT QUE

      Fin SI

      Renvoyer VIDE

    Seul l'ordre des 3 blocs changent dans les 3 versions.

    L'algorithme préfixe en français

    L'algorithme consiste à :

      Si l'arbre n'est pas VIDE

      1. Empiler l'arbre dans une Pile
      2. Tant que la Pile n'est pas vide
        1. Dépiler le prochain arbre, nommons le a.
        2. Explorer la racine de l'arbre a
        3. Empiler le sous-arbre gauche de a si le sous-arbre n'est pas VIDE.
        4. Empiler le sous-arbre gauche de a si le sous-arbre n'est pas VIDE.
    6.4 Pile sous forme de list Python

    A - Implémentation rapide avec list
    1. nouvelle_pile() -> 'Pile VIDE'
    2. >>> p = [] # ou p = list()
    3. est_pile_vide(p:'Pile') -> bool
    4. >>> p == [] True
    5. empiler(elt:'Elt', p:'Pile') -> None
    6. >>> p.append(50) # on place 50 au sommet >>> p.append(10) # on place 50 au sommet
    7. depiler(p:'Pile NON VIDE') -> 'Elt'
    8. >>> p.pop() # on dépile le sommet 10
    9. lire_sommet(p:'Pile NON VIDE') -> 'Elt'
    10. >>> p[len(p)-1] # ou juste p[-1] 50
    11. taille(p:'Pile') -> int
    12. >>> len(p) 1
    B - Erreurs classiques sur les muables

    N'écrivez donc JAMAIS ceci avec une pile muable :

    >>> p = p.append(50) # p contient maintenant None, bravo... >>> p = p.pop() # p n'est plus une pile mais un élément, bravo...

    7 - FAQ

    Rien pour le moment

    Après cette introduction à l'exploration des arbres, il reste à voir pourquoi trois méthodes, comment choisir et voir s'il existe d'autres façons de faire. Mais, c'est pour la prochaine fois.

    Activité publiée le 29 11 2020
    Dernière modification : 31 01 2024
    Auteur : ows. h.