Structures de données et de fichiers
|
Enoncé 43. Arbre de recherche binaire. Corrigé 43
Problème : Exploration des niveaux d'un arbre de recherche binaire
Ecrire la fonction récursive Premier(x, R) qui donne le premier nud, s'il existe, du niveau x de d'un arbre de recherche binaire R.
Soit n un nud du niveau i. On définit les ascendants gauches du nud n tout nud se trouvant sur le chemin de n à la racine par lequel on remonte par la gauche. Ecrire le module Ascendant_gauche (n, i, n', i') qui détermine le plus jeune ascendant gauche n', s'il existe, du nud n de niveau i qui a un fils droit. Ce module donne également le niveau i' du nud n'. On utilisera le module PERE.
Utiliser Premier(x, R) et Ascendant_gauche (n, i, n', i') pour écrire la fonction Suiv(A, i) qui donne le prochain nud du niveau i, s'il existe, à droite d'un nud donné A de niveau i.
Ecrire le module Lister (P, Niv) qui liste tous les nuds, s'ils existent, à droite de P du niveau Niv dans le même niveau.
Voici un exemple d'algorithme principal qui fait appel à tous les modules demandés
Soient
A , P , Q, Pprime Des Arb ; Xprime, Niv Des Entiers ;
Soient Premier, Suiv des Fonctions ( Arb ) ;
Soient Ascendant_gauche, Lister des Action ;
Debut
Creer_arb ( A , [ 30 , 20 , 60 , 15 , 18 , 12 , 19 , 17 , 80 , 70 , 74
, 76 , 78 , 92 ] ) ;
Lire ( Niv ) ;
P := Premier ( Niv , A ) ;
Si P <> Nil
Ecrire ( Info ( P ) ) ;
Appel Ascendant_gauche ( P , Niv , Pprime ,
Xprime ) ;
Si Pprime <> Nil
Ecrire ( Info ( Pprime
) , Xprime )
Sinon
Ecrire ( 'Echec' ) ;
Fsi ;
Q := Suiv(P, Niv);
Si Q <> Nil : Ecrire ( Info ( Q ) ) Sinon
Ecrire ( 'Echec' ) ; Fsi ; Appel Lister ( P, niv
) ;
Sinon
Ecrire ( 'Echec' )
Fsi
Fin
Pour l'arbre généré, PREMIER(3, A) donne l'adresse du nud 12. PREMIER(5, A) donne l'adresse du nud 76. PREMIER(0, A) donne l'adresse du nud 30. PREMIER(8, 0) donne le message 'Echec'. Le nud avec la valeur 17 admet comme ascendant gauche les nuds avec les valeurs 18, 20 et 30. 18 étant le plus jeune. Si n est l'adresse de 17 de niveau i =4 alors Ascendant(n, i, n', i') donne comme valeur n' : l'adresse de 18 et i' la valeur 3. Si n est l'adresse de 19 de niveau i =4 alors Ascendant(n, i, n', i') donne comme valeur n' : l'adresse de 30 et i' la valeur 0. Si n est l'adresse de 74 de niveau i =4 alors Ascendant(n, i, n', i') donne le message 'Echec'. Si n est l'adresse de 18 de niveau i =3 alors Suiv(n, 3) donne le nud avec la valeur 70. Si n est le nud avec la valeur 12, Lister(P, 3) donne 18, 70 et 92. Si n est le nud avec la valeur 15, Lister(P, 2) donne 80.