Klouche-Djedid A.Département Informatique-IGMO

Les arbres et leurs parcours
;

CHAPITRE-Les arbres_parcours-implémentation

Définitions :

Graphe orienté fini : C’est un ensemble fini de points appelés « nœuds » ou « sommets », associé à un ensemble fini de lignes appelées « arcs », joignant chacune un nœud à un autre.

Il existe au plus un arc joignant un nœud origine donné à un nœud extrémité donné. Si A et B sont 2 nœuds, l’arc AB (s’il existe) est différent de l’arc BA (s’il existe).

Arbres : C’est un graphe orienté défini sur un ensemble de nœuds X tel que :

ü      il existe dans X un nœud particulier r appelé la racine de l’arbre.

ü      les autres nœuds , s’il en existe, sont partitionnés en m sous-ensembles X1,X2,…,Xm , qui sont à leur tour des arbres de racines respectives r1,r2,…,rm, tels que pour tout i de 1 à m il existe un arc d’origine r et d’extrémité ri .Ces arbres sont appelés les « sous-arbres » de X.

 

 

                                            r                           arbre X

 

 

 

 

                                r1         r2             r3        sous-arbre X3

 

             r11

 

                r12      r13   r14              r31        r32

 

 

                                                             r321  r322

                                                        fig 1

Filiation : Dans un arbre on définit des relations de filiation comme suit :

Un nœud  B est dit « fils » d’un autre nœud A s’il existe un arc d’origine A et d’extrémité B. le nœud A est appelé « père » de B. les fils d’un même père sont dits « frères ». dans fig1  r31 est fils de r3

Arbre ordonné : C’est un arbre dans lequel une relation d’ordre est établie entre les fils d’un même nœud (les frères)

degré : Le degré d’un nœud est égal au nombre de fils de ce nœud .

deg de   r1  =  4

feuille : Les feuilles d’un arbre sont les nœuds de degré 0 . Une feuille est encore appelée « nœud terminal » et par opposition, un nœud de degré différent de 0 est appelé « nœud non terminal ».

niveau : La relation de filiation crée des niveaux dans un arbre. Le niveau de la racine est 1 et tout nœud fils d’un nœud de niveau i est au niveau i+1.

niveau de r11  = 3

Profondeur : On appelle profondeur d’un arbre le niveau maximum de ses nœuds.

arbre n-aire : C’est un arbre dans lequel chaque nœud a au plus n fils

l’arbre X est 4-aire ; le sous –arbre X3 est binaire

 arbre n-aire homogène : un arbre n-aire est dit homogène, si tous ses nœuds non terminaux sont de degré n.

arbre équilibré : C’est un arbre où tous les nœuds terminaux ont même niveau.

arbre n-aire complet  c’est un arbre homogène et équilibré.

 

Les arbres binaires

Un arbre binaire est un arbre ordonné tel que chaque nœud a au plus 2  fils, respectivement appelé « fils gauche » et « fils droit ».

De tels arbres sont souvent utilisés et ont de multiples applications.

Exemples : représentation d’une expression :toute opération binaire porte sur 2 opérandes, généralement ordonnés, et peut donc être représentée par un sous_arbre dont la racine est l’opérateur et dont les fils gauche et droit sont respectivement le premier et le deuxième opérande.

Ainsi l’opération « A+B » est représentée par le sous_arbre suivant :

                                                               

        +

 

 

 

A            B

fig.2

de la même manière on représente toute opération unaire par un sous-arbre  dont la racine est l’opérateur et dont le fils unique représente l’opérande . L’opération « -C » est représentée comme suit :

                                              

                      _

 

 

 

       C

fig3

Une expression peut se donc être représentée par un arbre binaire dont la structure hiérarchique reflète l’ordre d’exécution des opérations constituant l’expression. Soit à titre d’exemple l’expression  suivante :

     A**2-B+C*(D/-5)

 

Conformément à la priorité associée à chaque opérateur, cette expression peut être interprétée comme suit :

        ((A**2)- B ) + (C * ( D /  -5))

 

Il s’agit donc d’une addition avec comme 1er opérande (A**2)- B et comme 2ème opérande C*(D/-5) . Chaque opérande constitue à son tour une expression et sera donc représenté par un sous-arbre. L’arbre représentant l’expression est le suivant :

 

                                         +

 

 

                        _                       *

 

 

 

            **             B            C            /

 

 

                                                                  _

     A          2                                 D        

 

 

                                                                   5

                                                                          fig4          

Parcours d’arbre binaire

parcourir un arbre consiste à examiner une fois et une seule chacun de ses nœuds , dans un certain ordre. pour un arbre binaire les ordres de parcours les plus utilsés sont :

parcours pré-ordre : Il est aussi appelé préfixé ;dans cet ordre de parcours le père est examiné avant les fils. Il s’effectue, pour chaque sous-arbre, en 3 étapes ordonnées comme suit :

Ø      Examen du père,

Ø      Parcours en pré-ordre du sous-arbre gauche,

Ø      Parcours en pré-ordre du sous-arbre droit.

appliqué à l’ensemble de la fig 4 cet ordre de parcours donne le résultat suivant :

 

                              

                                         +

 

 

                        _                       *

 

 

 

            **             B            C            /

 

 

                                                                  _

      A          2                               D        

 

 

                                                                   5

 

 

soit  + - ** A 2 B * C / D – 5

dans cette forme d’écriture de l’expression, l’opérateur précède le(s) opérande(s) qui lui sont associé(s). Les parenthèses ne sont pas utilisées puisque les opérateurs apparaissent dans l’ordre de leur exécution. Cette écriture est appelée « notation polonaise préfixée ».

parcours post-ordre :aussi appelé « post-fixé » ou terminal, il consiste à examiner les fils avant le père en commençant par le fils gauche. Pour chaque sous-arbre les 3 étapes s’exécutent dans l’ordre suivant :

Ø      parcours du sous-arbre gauche,

Ø      parcours du sous-arbre droit,

Ø      examen du père.

pour l’ensemble de la fig4 on obtient avec cet ordre de parcours le résultat :

 

                                         +

 

 

                        _                       *

 

 

 

            **             B            C            /

 

 

                                                                  _

    A          2                                   D        

 

 

                                                                   5

         soit   A 2 ** B – C D 5 - / * +

Dans cette écriture ce sont les opérandes qui précèdent l’opérateur et les opérateurs apparaissent dans ce cas aussi dans leur ordre d’exécution ce qui rend inutile l’utilisation des parenthèses. Cette écriture est appelée « notation polonaise post-fixée »

parcours symétrique :

appelé aussi « infixé » le père est examiné avant le fils droit et après le fils gauche.

cet ordre de parcours applique à la fig4 donne le résultat :

 

                                         +

 

 

                        _                       *

 

 

 

            **             B            C            /

 

 

                                                                  _

     A          2                                 D        

 

 

                                                                   5

 

         soit A ** 2 – B + C * D / -5

Parcours en largeur : rarement appliqué, il consiste à examiner les nœuds par niveaux successifs, de gauche à droite. Son application sur fig4 donne

         + - * ** B C / A 2 D – 5

Algorithmes de parcours

Afin de définir ces algorithmes, sans tenir compte de la représentation de l’arbre, nous utiliserons les fonctions suivantes :

 

EXISTEG(X) : fonction booléenne, retourne la valeur « vrai » si le sous-arbre gauche du nœud X transmis en entrée existe.

 

EXISTED(X) : fonction booléenne, retourne la valeur « vrai » si le sous-arbre droit du nœud X transmis en entrée existe.

 

GAUCHE(X) : cette fonction n’est définie que si EXISTEG (X) est vrai ; elle retourne la valeur du fils gauche du nœud X.

 

DROITE(X) : cette fonction n’est définie que si EXISTED (X) est vrai ; elle retourne la valeur du fils droit du nœud X.

 

On utilisera également, dans l’écriture des algorithmes la primitive EXAMINER(X) qui a pour rôle d’examiner le nœud X et éventuellement de lui faire subir un traitement quelconque.

 

Les 3 types de parcours définis plus haut sont basés sur la définition récurrente des arbres, on pourra don définir des algorithmes récursifs pour ces 3 ordres de parcours.

Les procédures à définir effectuent le parcours d’un arbre binaire non vide,et ont pour paramètre d’entrée la racine de cet arbre.

 

Procédure parcours préordre récursif : PPR

procedure PPR(racine)

debut

EXAMINER(racine)

si EXISTEG (racine)   alors  PPR( GAUCHE (racine))  fsi

si EXISTED (racine)   alors  PPR( DROITE (racine ))  fsi

fin   (*PPR*)

 

Procédure parcours préordre itératif : PPI

L’algorithme itératif nécessite  l’utilisation d’une pile  P  pour sauvegarder tout nœud examiné, afin de pouvoir parcourir son sous-arbre  droit après avoir effectué le parcours de son sous-arbre gauche.

Le parcours du sous-arbre gauche d’un nœud X est réalisé par la procédure PG définie ci-dessous.

procedure  PPI (racine)                         procedure PG(X)

debut                                                      debut

X ß racine                                             EXAMINER(X)

PG(X)                                                     EMPILER (X)

repeter                                                  tant que EXISTEG(X)

   DEPILER(X)                                         faire

   si EXISTED(X)                                      X ß GAUCHE(X)

   alors                                                         EXAMINER(X)

     X ß  DROITE(X)                                 EMPILER(X)

      PG(X)                                                 finfaire

   fsi                                                          fin  PG

jusqu’à  VIDE(P)                                     

fin  PPI

 

Procédure parcours postordre récursif :PTR

procedure PTR(racine)

debut

si EXISTEG (racine)   alors  PTR( GAUCHE (racine))  fsi

si EXISTED (racine)   alors  PTR( DROITE (racine ))  fsi

EXAMINER(racine)

fin   (*PTR*)

 

Procédure parcours symétrique récursif :PSR

 

procedure PSR(racine)

debut

si EXISTEG (racine)   alors  PSR( GAUCHE (racine))  fsi

EXAMINER(racine)

si EXISTED (racine)   alors  PSR( DROITE (racine ))  fsi

fin   (*PSR*)

 

 

 

 

 

 

 

 

 

 

 

 

Implémentation des arbres binaires à l’aide des pointeurs et variables dynamiques.

Tout comme les listes chaînées, on peut représenter les arbres binaires à l’aide de la structure des pointeurs et variables dynamiques tels que décrits dans le chapitre « pointeurs & variables dynamiques »

 

Reprenons l’exemple de fig1 « les arbres et leurs parcours »

 

                                         +

 

 

                        _                       *

 

 

 

            **             B            C            /

 

 

                                                                  _

     A          2                                 D        

 

 

                                                                   5

                                 fig1

 

soit la structure de type pointeur définie comme suit :

 

type  lien = @objet ;

         objet = record    info : char

                                   filsg : lien

                                   filsd : lien

                    end ;

shématisée par

 

info          filsg      filsd

 

 

l’exemple de la fig1 peut être représenté comme suit :

 

+

*

/

C        nil  nil

_

B     nil     nil

**         

2     nil     nil

D     nil     nil

A      nil    nil

5      nil     nil

_               nil

 

 

 

 

 


P.S. notre objectif principal étant de décrire les concepts, veuillez ne pas tenir rigueur des éventuels omissions,oublis de signes ,ponctuations dans les programmes . pour d'autres coquilles soupçonnées plus sérieuses, nous comptons sur votre participation ,faisons de notre mieux!