Corrigé 5. Enoncé
1. Définition de fonctions récursives
Fonction Trouve ( L, N)
Détermine si un élément N peut être retrouvé dans une liste linéaire chaînée L.
L est un pointeur, N est objet de type quelconque.
SI L = NIL
Trouve := FAUX
SINON
SI Valeur(L) = N
Trouve:= VRAI
SINON
Trouve := Trouve(
Reste(L), N)
FSI
FSI
Fonction Commun (L1, L2)
Détermine si 2 listes linéaires L1 et L2 ont au moins 1 élément en commun.
L1 et L2 sont deux pointeurs de tête de liste :
SI L1 = NIL
Commun := FAUX
SINON
SI Trouve(L2, Valeur(L1) )
Commun := VRAI
SINON
Commun := Commun (
Reste(L1), L2) )
FSI
FSI
Fonction Tous( L1, L2)
Détermine si tous les éléments de L1 peuvent être retrouvés dans L2.
L1 et L2 sont deux pointeurs de tête de liste.
SI L1 = NIL
Tous := VRAI
SINON
SI NON Trouve(L2, Valeur(L1) )
Tous := FAUX
SINON
Tous := Tous(
Reste(L1), L2))
FSI
FSI
2. Puzzle
Ecriture de la procédure Construire ( Objet, Arbre1, Arbre2, Arbre )
Objet est un élément de type quelconque.
Arbre1, Arbre2 et Arbre sont des références de type Typearbre ( à définir selon la
représentation choisie).
Le corps est le suivant :
Arbre := Créernoeud( Objet)
Aff_Fg(Arbre, Arbre1)
Aff_Fd(Arbre, Arbre2)
Fonction Insérer (X, A)
X est un objet de type quelconque et A est de type Typearbre ( à définir selon la
représentation choisie).
Le texte en souligné complète l'algorithme de l'énoncé.
SI A = NIL
Construire ( X, NIL, NIL, Arbre)
Inserer := Arbre
SINON
SI X < Info(A)
Construire(Info(A),
Inserer(X, Fg(A)), Fd(A), Arbre)
Inserer := Arbre ;
Liberernoeud(A)
SINON
Construire (Info(A),
Fg(A), Inserer(X,Fd(A)), Arbre)
Inserer := Arbre ;
Liberernoeud(A)
FSI
FSI
Trace :
3. Représentation séquentielle
Structures de données
A est un tableau d'éléments. Chaque élément est le couple(Valeur,
Bit).
TYPE Typecouple = STRUCTURE
Valeur : Typeqq
Bit : BOOLEEN { Présence ou
non de l'élément }
FIN
L'arbre A est alors défini comme suit ( la racine est toujours à la
première position) :
VAR A : Tableau[1..N] DE Typecouple
Implémentation des opérations possibles
Fg(P) : Fg := 2*p
Fd(P) : Fd := 2*p + 1
Aff_Fg et Aff_Fd n'ont plus de sens ici puisque les champs Fd et Fg n'existent pas dans
cette représentation.
Info(P)
: Info := A(P).Valeur
Aff_Info(P, Val) : A(P).Valeur := Val
Bit(P)
: Bit :=
A(P).Bit
Aff_Bit(P, B) :
A(P).Bit := B
Libérer (P)
: A(P).Bit := FAUX
La procédure Créerarbre(A) (créer un arbre vide) suivante est nécessaire pour tout
traitement sur des arbres représentés ainsi :
POUR I =1,N : A(I).Bit := FAUX FINPOUR
Algorithme non récursif d'insertion d'un élément X dans un arbre
de recherche binaire ainsi représenté
Soit Arbre la racine de l'arbre.
Lire(X)
Trouv := FAUX
P, Q := Arbre
TANTQUE Q <= N ET Bit(Q) ET NON Trouv (1)
P := Q
SI X = Info(P)
Trouv := VRAI
SINON
SI X < Info(P)
Q := Fg(P)
SINON
Q := Fd(P)
FSI
FSI
FINTANTQUE
SI Trouv
" X existe déjà"
SINON
SI X < Info(P)
Créeràgauche(P, X)
SINON
Créeràdroite(P,X)
FSI
FSI
avec Créeràgauche (P, X) définie comme suit :
Soit Q une variable entière.
Q := Fg(P)
SI Q > N
" Erreur "
SINON
SI Bit(Q)
" Erreur "
SINON
Aff_Info(Q, X)
Aff_Bit(Q, VRAI)
FSI
FSI
La procédure Creéràdroite est similaire. Il suffit de remplacer Fg par Fd.
Remarque : dans cet algorithme, Bit(P) est définie comme suit :
Bit(P) :
SI P <= N
Bit := A(p).Bit
SINON
Bit := FAUX
FSI
Sans ça, Bit(Q) ne serait pas définie dans tous les cas dans le critère d'arrêt (1).