C NUMO      SOURCE    CHAT      05/01/13    02:03:22     5004
C**************************************************************************
C**************************************************************************
C****************************                   ***************************
c************************         NUMero         **************************
c****************************                   ***************************
C**************************************************************************
C**************************************************************************



C       on renumerote les noeuds a partir de l'arborescence obtenue
C       par le biais de la subroutine IFILSFRE.
C       pour se faire, on se sert d'une pile, surlaquelle on empile ou depile.


        SUBROUTINE NUMO(IFILS,IFRERE,RACINE,IORDRE,NBENS)
      IMPLICIT INTEGER(I-N)

        INTEGER RACINE,NBENS
        SEGMENT IORDRE(0)
        SEGMENT IFRERE(0),IFILS(0)

        SEGMENT IPILE(NBENS+1)
        INTEGER EMPIL,DEPIL

        SEGINI IPILE
        N=NBENS
C       le nombre de noeuds a empiler est egal a NBENS.

        IPILE(1)=1
        IPILE(2)=RACINE
C       la taille de la pile est dans IPILE(1).
C       le premier element de la pile est la RACINE.

10      IF (N.NE.0) THEN
C       s'il reste des elements a empiler,

50         EMPIL=IFRERE(IPILE(IPILE(1)+1))
C          on cherche, le frere du dernier element empile.

           IF (EMPIL.NE.0) THEN
C          s'il existe,
                IPILE(1)=IPILE(1)+1
                IPILE(IPILE(1)+1)=EMPIL
C               on l'empile dans la pile.
           GOTO 50
C          on recommence jusqu'a ne plus avoir de frere.
           ENDIF

20         IF (N.EQ.0) GOTO 30
C          quand on a tout empile,on a fini.

           DEPIL=IPILE(IPILE(1)+1)
           IPILE(1)=IPILE(1)-1
C          au fur et a mesure qu'on empile,on depile


          IORDRE(DEPIL+NBENS)=N
          IORDRE(N)=DEPIL
          N=N-1
C         on numerote les noeuds depiles par ordre decroissant.

          IF(IFILS(DEPIL).NE.0)  THEN
             IPILE(1)=IPILE(1)+1
             IPILE(IPILE(1)+1)=IFILS(DEPIL)
C           si le noeud depile a un fils,
C           on empile ce fils a la position de son pere
C           qui a ete depile.
          ELSE
           GOTO 20
C          sinon,on redepile.
          ENDIF

        GOTO 10
        ENDIF

        SEGSUP IPILE
C       suppression du segment de travail.

30      RETURN
        END

