ACTION Supprimer ( Val )
SOIT
Val UN ENTIER ;
Sauv_balance UN ENTIER ;
P , Q , D DES ARB DE ( ENTIER , ENTIER ) ;
Trouv UN BOOLEEN ;
Branche UNE PILE DE ARB DE ( ENTIER , ENTIER ) ;
Sens UN ENTIER ;
DEBUT
CREERPILE ( Branche ) ;
P := Avl ;
Q := NIL ;
Trouv := FAUX ;
TQ ( P <> NIL ) ET NON Trouv
SI STRUCT ( INFO ( P ) , 1 ) = Val
Trouv := VRAI
SINON
Q := P ;
EMPILER ( Branche , P ) ;
SI STRUCT ( INFO ( P ) , 1 ) > Val
P := FG ( P ) ;
Sens := - 1
SINON
P := FD ( P ) ;
Sens := + 1
FSI
FSI
FTQ ;
SI Trouv
SI ( FG ( P ) = NIL ) ET ( FD ( P ) = NIL )
SI Q = NIL
Avl := Q ;
/* Bug : AVL:= NIL ne marche
pas!!! */
SINON
SI FG ( Q ) = P
AFF_FG ( Q , NIL )
SINON
AFF_FD ( Q , NIL )
FSI
FSI
SINON
SI FG ( P ) = NIL
SI Q = NIL
Avl := FD ( P )
SINON
SI FG ( Q ) = P
AFF_FG ( Q , FD ( P ) )
SINON
AFF_FD ( Q , FD ( P ) )
FSI
FSI
SINON
SI FD ( P ) = NIL
SI Q = NIL
Avl := FG ( P )
SINON
SI FG ( Q ) = P
AFF_FG ( Q , FG ( P ) )
SINON
AFF_FD ( Q , FG ( P ) )
FSI
FSI
SINON
D := FD ( P ) ;
Sens := + 1 ;
Q := P ;
EMPILER ( Branche , P ) ;
TQ FG ( D ) <> NIL
EMPILER ( Branche , D ) ;
Q := D ;
D := FG ( D ) ;
Sens := - 1
FTQ ;
{EMPILER ( Branche , D ) ;}
Sauv_balance := Balance ( P ) ;
AFF_INFO ( P , INFO ( D ) ) ;
APPEL Aff_balance ( P , Sauv_balance ) ;
SI FG ( Q ) = D
AFF_FG ( Q , FD ( D ) )
SINON
AFF_FD ( Q , FD ( D ) )
FSI
FSI
FSI
FSI ;
SI ( Q <> NIL )
APPEL Equilibrer_sup ( Branche , Sens )
FSI
FSI ;
FIN
ACTION Equilibrer_sup ( Branche , Sens ) ;
SOIT
Branche UNE PILE DE ARB DE ( ENTIER , ENTIER ) ;
P , R , Parent DES ARB DE ( ENTIER , ENTIER ) ;
Arret UN BOOLEEN ;
Sens UN ENTIER ;
Racine UN ARB DE ( ENTIER , ENTIER ) ;
Stop UN BOOLEEN ;
DEBUT
Arret
:= FAUX ;
DEPILER ( Branche , R ) ;
{ ECRIRE ( 'R:' , INFO ( R ) ) ;}
APPEL Aff_balance ( R , Balance ( R ) + Sens ) ;
SI PILEVIDE ( Branche )
Parent
:= NIL
SINON
DEPILER ( Branche , Parent ) ;
FSI ;
SI ( Balance ( R ) = 2 ) OU ( Balance ( R ) = - 2 )
SI Balance ( R ) = 2
APPEL Transf3 ( R , Parent , Racine ) ;
SINON
APPEL Transf4 ( R , Parent , Racine ) ;
FSI ;
R :=
Racine ;
{ECRIRE ( 'Rapres:'
, INFO ( R ) ) ;}
SINON
Arret
:= ( Balance ( R ) <> 0 )
FSI ;
TQ ( Parent <> NIL ) ET ( NON Arret )
P :=
Parent ;
{ECRIRE (
'P:' , INFO ( P ) ) ;}
SI ( FG ( P ) = R )
SI ( Balance ( R ) = 0 )
APPEL Aff_balance ( P , Balance ( P ) - 1 )
SINON
Arret := VRAI
FSI
SINON
SI ( Balance ( R ) = 0 )
APPEL Aff_balance ( P , Balance ( P ) + 1 )
SINON
Arret := VRAI
FSI
FSI ;
SI PILEVIDE ( Branche )
Parent := NIL
SINON
DEPILER ( Branche , Parent ) ;
FSI ;
SI ( Balance ( P ) = 2 ) OU ( Balance ( P ) = - 2 )
SI Balance ( P ) = 2
APPEL Transf3 ( P , Parent , Racine ) ;
SINON
APPEL Transf4 ( P , Parent , Racine ) ;
FSI ;
R := Racine
SINON
SI Balance ( P ) <> 0
Arret
:= VRAI
SINON
R := P ;
FSI
FSI
FTQ ;
FIN
ACTION Transf3 ( A , Parent , Racine ) ;
SOIT
A , B , C , Parent , Racine DES ARB DE ( ENTIER , ENTIER ) ;
DEBUT
ECRIRE ( 'transf3' ) ;
{A doit avoir un fils gauche}
B := FG ( A ) ;
SI ( Balance ( B ) = 1 ) OU ( Balance ( B ) = 0 )
{Rotation droite}
ECRIRE ( 'Rotation droite
autour de ' , STRUCT ( INFO ( B ) , 1 ) ) ;
AFF_FG ( A , FD ( B ) ) ;
AFF_FD ( B , A ) ;
SI Balance ( B ) = 1
APPEL Aff_balance ( B , 0 ) ;
APPEL Aff_balance ( A , 0 ) ;
SINON
APPEL Aff_balance ( B , - 1 ) ;
APPEL Aff_balance ( A , 1 ) ;
FSI ;
Racine
:= B ;
SI Parent = NIL
Avl := B
SINON
SI FG ( Parent ) = A
AFF_FG ( Parent , B )
SINON
AFF_FD ( Parent , B )
FSI
FSI
SINON
ECRIRE ( 'Rotation gauche
suivie par une rotation droite autour de '
, STRUCT ( INFO ( FD ( B ) ) , 1 ) ) ;
{ balance(b)
= -1 }
{soit C le
fils droit de B (qui doit exister) }
C := FD ( B ) ;
{rotation
gauche}
AFF_FD ( B , FG ( C ) ) ;
AFF_FG ( C , B ) ;
{suivie par
une rotation droite}
AFF_FG ( A , FD ( C ) ) ;
AFF_FD ( C , A ) ;
{maj balance}
SI Balance ( C ) = 0
{ C est le
nouveau noeud inséré }
APPEL Aff_balance ( A , 0 ) ;
APPEL Aff_balance ( B , 0
) ;
SINON
SI Balance ( C ) = 1
APPEL Aff_balance ( A , - 1 ) ;
APPEL Aff_balance ( B , 0 ) ;
APPEL Aff_balance ( C , 0 ) ;
SINON
APPEL Aff_balance ( A , 0 ) ;
APPEL Aff_balance ( B , + 1 ) ;
APPEL Aff_balance ( C , 0 ) ;
FSI
FSI ;
Racine
:= C ;
SI Parent = NIL
Avl := C
SINON
SI FG ( Parent ) = A
AFF_FG ( Parent , C )
SINON
AFF_FD ( Parent , C )
FSI
FSI
FSI
FIN
ACTION Transf4 ( A , Parent , Racine ) ;
SOIT
A , B , C , Parent , Racine DES ARB DE ( ENTIER , ENTIER ) ;
DEBUT
ECRIRE ( 'transf4' ) ;
{A doit avoir un fils droit}
B := FD ( A ) ;
SI ( Balance ( B ) = - 1 ) OU ( Balance ( B ) = 0 )
ECRIRE ( 'Rotation gauche
autour de ' , STRUCT ( INFO ( B ) , 1 ) ) ;
{Rotation
gauche}
AFF_FD ( A , FG ( B ) ) ;
AFF_FG ( B , A ) ;
SI Balance ( B ) = - 1
APPEL Aff_balance ( B , 0
) ;
APPEL Aff_balance ( A , 0 ) ;
SINON
APPEL Aff_balance ( B , + 1 ) ;
APPEL Aff_balance ( A , - 1 ) ;
FSI ;
Racine
:= B ;
SI Parent = NIL
Avl := B
SINON
SI FG ( Parent ) = A
AFF_FG ( Parent , B )
SINON
AFF_FD ( Parent , B )
FSI
FSI
SINON
ECRIRE ( 'Rotation droite
suivie par une rotation gauche autour de '
, STRUCT ( INFO ( FG ( B ) ) , 1 ) ) ;
{ balance(b)
= +1 }
{soit C le
fils gauche de B (qui doit exister) }
C := FG ( B ) ;
{rotation
gauche}
AFF_FG ( B , FD ( C ) ) ;
AFF_FD ( C , B ) ;
{suivie par
une rotation droite}
AFF_FD ( A , FG ( C ) ) ;
AFF_FG ( C , A ) ;
{maj balance}
SI Balance ( C ) = 0
{C est le
nouveau noeud inséré }
APPEL Aff_balance ( A , 0 ) ;
APPEL Aff_balance ( B , 0 ) ;
SINON
SI Balance ( C ) = 1
APPEL Aff_balance ( A , 0 ) ;
APPEL Aff_balance ( B , - 1 ) ;
APPEL Aff_balance ( C , 0 ) ;
SINON
APPEL Aff_balance ( A , + 1 ) ;
APPEL Aff_balance ( B , 0 ) ;
APPEL Aff_balance ( C , 0
) ;
FSI
FSI ;
Racine
:= C ;
SI Parent = NIL
Avl := C
SINON
SI FG ( Parent ) = A
AFF_FG ( Parent , C )
SINON
AFF_FD ( Parent , C )
FSI
FSI
FSI
FIN