ACTION Inserer ( Val )
SOIT
Val UN ENTIER ;
Doublet UN ( ENTIER , ENTIER ) ;
P , Q , R DES ARB DE ( ENTIER , ENTIER ) ;
Trouv UN BOOLEEN ;
Branche UNE PILE DE ARB DE ( ENTIER , ENTIER ) ;
DEBUT
ECRIRE ( 'inserer
>>>' , Val ) ;
CREERPILE ( Branche ) ;
SI Avl = NIL
INIT_STRUCT ( Doublet , [ Val , 0 ] ) ;
CREERNOEUD ( Avl ) ;
AFF_INFO ( Avl , Doublet )
SINON
P :=
Avl ;
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 )
SINON
P := FD ( P )
FSI
FSI
FTQ ;
SI NON Trouv
INIT_STRUCT ( Doublet , [ Val , 0 ] ) ;
CREERNOEUD ( R ) ;
AFF_INFO ( R , Doublet ) ;
SI Val < STRUCT ( INFO ( Q ) , 1 )
AFF_FG ( Q , R )
SINON
AFF_FD ( Q , R )
FSI ;
APPEL Equilibrer_ins ( Branche , R ) ;
FSI ;
FSI
FIN
ACTION Equilibrer_ins ( Branche , R ) ;
SOIT
Branche UNE PILE DE ARB DE ( ENTIER , ENTIER ) ;
P , R , Parent DES ARB DE ( ENTIER , ENTIER ) ;
Arret UN BOOLEEN ;
DEBUT
Arret := FAUX ;
TQ NON PILEVIDE ( Branche ) ET ( NON Arret )
DEPILER ( Branche , P ) ;
SI FG ( P ) = R
APPEL Aff_balance ( P , Balance ( P ) + 1 )
SINON
APPEL Aff_balance ( P , Balance ( P ) - 1 )
FSI ;
SI ( Balance ( P ) = 2 ) OU ( Balance ( P ) = - 2 ) OU ( Balance ( P ) = 0 )
Arret := VRAI
SINON
R := P ;
FSI
FTQ ;
SI Arret
SI Balance ( P ) <> 0
SI PILEVIDE ( Branche )
Parent := NIL
SINON
DEPILER ( Branche , Parent )
FSI ;
SI Balance ( P ) = 2
APPEL Transf1 ( P , Parent )
SINON
APPEL Transf2 ( P , Parent )
FSI
FSI
FSI
FIN
ACTION Transf1 ( A , Parent ) ;
SOIT
A , B , C , Parent DES ARB DE ( ENTIER , ENTIER ) ;
DEBUT
ECRIRE ( 'transf1' ) ;
{A doit avoir un fils gauche}
B := FG ( A ) ;
SI Balance ( B ) = 1
{noeud inséré à gauche de B}
{Rotation droite}
ECRIRE ( 'Rotation droite
autour de ' , STRUCT ( INFO ( B ) , 1 ) ) ;
AFF_FG ( A , FD ( B ) ) ;
AFF_FD ( B , A ) ;
APPEL Aff_balance ( B , 0 ) ;
APPEL Aff_balance ( A , 0 ) ;
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 }
{noeud inséré
à droite de B}
{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 ;
SI Parent = NIL
Avl := C
SINON
SI FG ( Parent ) = A
AFF_FG ( Parent , C )
SINON
AFF_FD ( Parent , C )
FSI
FSI
FSI
FIN
ACTION Transf2 ( A , Parent ) ;
SOIT
A , B , C , Parent DES ARB DE ( ENTIER , ENTIER ) ;
DEBUT
ECRIRE ( 'transf2' ) ;
{A doit avoir un fils droit}
B := FD ( A ) ;
SI Balance ( B ) = - 1
ECRIRE ( 'Rotation gauche
autour de ' , STRUCT ( INFO ( B ) , 1 ) ) ;
{noeud inséré
à droite de B}
{Rotation
gauche}
AFF_FD ( A , FG ( B ) ) ;
AFF_FG ( B , A ) ;
APPEL Aff_balance ( B , 0 ) ;
APPEL Aff_balance ( A , 0 ) ;
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 }
{noeud inséré
à gauche de B}
{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 ;
SI Parent = NIL
Avl := C
SINON
SI FG ( Parent ) = A
AFF_FG ( Parent , C )
SINON
AFF_FD ( Parent , C )
FSI
FSI
FSI
FIN