; Auteur : Comtois
; Date : 28 mars 2004
; PB version : 3.90
; Forum : http://purebasic.hmt-forum.com/viewtopic.php?t = 391
; Librairies extérieures utilisées : Aucune
; Categories : Algorithmes / Arbres
Structure Noeud
Mot.s ; Premier élément dans un noeud => un mot
Compteur.l ; Deuxième élément dans un noeud => nombre d'apparition du mot
*Gauche.Noeud ; Mot inférieur
*Droit.Noeud ; Mot supérieur
EndStructure
Global *Racine.Noeud
*Racine = #Null ; Initialise le premier noeud
Procedure CompareMot(Mot1.s, Mot2.s, Casse.l)
;-1 => Mot1 est inférieur à Mot2
; 0 => Mot1 est égal à Mot2
; 1 => Mot1 est supérieur à Mot2
; Si Casse = 0 => la procedure ne tient pas compte de la casse des mots
If Casse = 0
Mot1 = UCase(Mot1)
Mot2 = UCase(Mot2)
EndIf
Index = 1
While Mid(Mot1, Index , 1) = Mid(Mot2, Index , 1) And Len(Mot1)>= Index
Index + 1
Wend
If Mid(Mot1, Index, 1) = Mid(Mot2, Index , 1)
Resultat = 0
ElseIf Mid(Mot1, Index , 1) < Mid(Mot2, Index , 1)
Resultat = - 1
Else
Resultat = 1
EndIf
ProcedureReturn Resultat
EndProcedure
Procedure AfficheArbre(*Noeud.Noeud)
If *Noeud <> #Null
AfficheArbre(*Noeud\Gauche)
Debug *Noeud\Mot + " => " + Str(*Noeud\Compteur) + " fois"
AfficheArbre(*Noeud\Droit)
EndIf
EndProcedure
Procedure Arbre(*Noeud.Noeud, Mot.s)
; le noeud n'existe pas
If *Noeud = #Null
; ajoute un noeud
*Noeud = AllocateMemory(SizeOf(Noeud))
; initialise le noeud
If *Noeud
*Noeud\Mot = Mot
*Noeud\Compteur = 1
*Noeud\Gauche = #Null
*Noeud\Droit = #Null
Else
MessageRequester("Erreur", "Impossible d'allouer de la mémoire !", 0)
End
EndIf
; Recherche du mot par récursivité dans l'arbre
ElseIf CompareMot(Mot, *Noeud\Mot, 1)= 0
*Noeud\Compteur + 1
ElseIf CompareMot(Mot, *Noeud\Mot, 1)<0
*Noeud\Gauche = Arbre(*Noeud\Gauche, Mot)
Else
*Noeud\Droit = Arbre(*Noeud\Droit, Mot)
EndIf
ProcedureReturn(*Noeud)
EndProcedure
Procedure LectureTexte()
For a = 1 To 33
Read Ligne.s
Index = 1
Repeat
Mot.s = StringField(Ligne, Index, " ")
If Mot<>"" : *Racine = Arbre(*Racine, Mot) : EndIf
Index + 1
Until Mot = ""
Next a
EndProcedure
; exemple d'utilisation d'un arbre binaire => Comptage des mots dans un texte
LectureTexte()
AfficheArbre(*Racine)
; La Mouche du Coche de La Fontaine
DataSection
Data.s "Dans un chemin montant , sablonneux , malaisé ,"
Data.s "Et de tous les côtés au soleil exposé ,"
Data.s "Six forts chevaux tiraient un coche ."
Data.s "Femmes , moine , vieillards , tout était descendu ."
Data.s "L' attelage suait , soufflait , était rendu ."
Data.s "Une mouche survient , et des chevaux s' approche ,"
Data.s "Prétend les animer par son bourdonnement ,"
Data.s "Pique l' un , pique l' autre , et pense à tout moment"
Data.s "Qu' elle fait aller la machine ,"
Data.s "S' assied sur le timon , sur le nez du cocher ."
Data.s "Aussitôt que le char chemine ,"
Data.s "Et qu' elle voit les gens marcher ,"
Data.s "Elle s' en attribue uniquement la gloire ,"
Data.s "Va , vient , fait l' empressée : il semble que ce soit"
Data.s "Un sergent de bataille allant en chaque endroit"
Data.s "Faire avancer ses gens et hâter la victoire ."
Data.s "La mouche , en ce commun besoin ,"
Data.s "Se plaint qu' elle agit seule , et qu' elle a tout le soin ;"
Data.s "Qu' aucun n' aide aux chevaux à se tirer d' affaire ."
Data.s "Le moine disait son bréviaire :"
Data.s "Il prenait bien son temps ! Une femme chantait :"
Data.s "C' était bien de chansons qu' alors il s' agissait !"
Data.s "Dame mouche s' en va chanter à leurs oreilles ,"
Data.s "Et fait cent sottises pareilles ."
Data.s "Après bien du travail , le coche arrive au haut :"
Data.s "« Respirons maintenant , dit la mouche aussitôt :"
Data.s "J' ai tant fait que nos gens sont enfin dans la plaine ."
Data.s "Cà , Messieurs les Chevaux , payez - moi de ma peine . »"
Data.s " "
Data.s "Ainsi certaines gens , faisant les empressés ,"
Data.s "S' introduisent dans les affaires :"
Data.s "Ils font partout les nécessaires ,"
Data.s "Et , partout importuns , devraient être chassés ."
EndDataSection