1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
| class ArbreLexicographique {
private NoeudA racine;
/**
* Création d'un arbre lexicographie
*
* @param racine
*/
public ArbreLexicographique(NoeudA racine) {
/*
* On part du principe que la racine ne peut ni être LE noeud vide ni nulle
*/
if (racine==null) throw new NullPointerException();
this.racine=racine;
}
/**
* @param s = chaine de caractère
* @return La chaine appartient à l'arbre ?
*/
public boolean appartient(String s){
/*
* Quelles sont les conventions ici ????
*/
if (s==null) return false;
/*
* Arrêt si la chaine est épuisée
* C'est un succès si le noeud est marqué
*/
if (s.length()==0) return (racine instanceof NoeudMarque);
/*
* Parcourir toutes les alternatives possibles (les noeuds horizontaux)
*/
for (NoeudA noeudAPossibles=racine; noeudAPossibles != NoeudVide.getInstance(); noeudAPossibles=noeudAPossibles.getAlt()) {
/*
* Caractère trouvé ?
*/
if (noeudAPossibles instanceof Noeud) {
if (((Noeud)noeudAPossibles).getInfo()==s.charAt(0)) {
/*
* Appel réccursif vers le niveau inférieur
*/
return new ArbreLexicographique(((Noeud)noeudAPossibles).getSucc()).appartient(s.substring(1));
}
else if (((Noeud)noeudAPossibles).getInfo() > s.charAt(0)) break;
}
}
return false;
}
/**
* @param s = chaine de caractère
* @return La chaine est un préfixe parmis les chaines enregistrées ?
*/
public boolean prefixe(String s) {
/*
* Quelles sont les conventions ici ????
*/
if (s==null) return false;
/*
* Arrêt si la chaine est épuisée
* C'est un succès
*/
if (s.length()==0) return true;
/*
* Parcourir toutes les alternatives possible (les noeuds horizontaux)
*/
for (NoeudA noeudAPossibles=racine; noeudAPossibles!=NoeudVide.getInstance(); noeudAPossibles=noeudAPossibles.getAlt()) {
/*
* Caractère trouvé ?
*/
if (noeudAPossibles instanceof Noeud) {
if (((Noeud)noeudAPossibles).getInfo()==s.charAt(0)) {
/*
* Appel vers le niveau inférieur
*/
return new ArbreLexicographique(((Noeud)noeudAPossibles).getSucc()).prefixe(s.substring(1));
}
else if (((Noeud)noeudAPossibles).getInfo() > s.charAt(0)) break;
}
}
return false;
}
/**
* Insérer une marque à la racine de cet arbre
* @return false = insertion impossible (illogique..)
*/
private boolean insererMarque() {
/*
* Sinon il faut insérer une marque au noeud du dernier caractère
*/
if (racine instanceof Noeud) {
((Noeud)racine).setSucc(new NoeudMarque(((Noeud)racine).getSucc()));
return true;
}
/*
* Si le noeud est déjà marqué (la chaine existait déjà)
* Si c'est le tout premier noeud
* Ici on part du principe qu'on insère pas de chaine "" au top level
*/
else {
return false;
}
}
/**
* Insérer un branche simple derrière la racine
* @param s = chaine à insérer
*/
private void insereBrancheAlt(String s) {
/*
* Insérer le premier caractère de le nouvelle branche de caractères entre le précédant et le suivant
* !!! C'est délicat !!!
*/
Noeud nouvelleRacine = new Noeud(s.charAt(0),new NoeudMarque(),racine.getAlt());
racine.setAlt(nouvelleRacine);
/*
* Ajouter ensuite le reste de la chaine ... itératif ...
*/
for (int i=1;i<s.length();i++) {
Noeud noeudSuperieur = nouvelleRacine;
nouvelleRacine = new Noeud(s.charAt(i),new NoeudMarque(),NoeudVide.getInstance());
noeudSuperieur.setSucc(nouvelleRacine);
}
}
/**
* Ajout d'une chaine à la racine de l'arbre en cours
*
* @param s = Chaine à rajouter
* @return Chaine ajoutée ?
*/
public boolean ajout(String s){
/*
* Quelles sont les conventions ici ????
*/
if (s==null) return false;
/*
* Arrêt si la chaine est épuisée
*/
if (s.length()==0) return insererMarque();
/*
* Recherche le premier caractère dans les alternatives
*/
NoeudA noeudPrecedant = racine;
for (NoeudA noeudCourant=racine; noeudCourant != NoeudVide.getInstance(); noeudCourant=noeudCourant.getAlt()) {
/*
* Si le caractère existe déjà
*/
if (noeudCourant instanceof Noeud) {
if (((Noeud)noeudCourant).getInfo()==s.charAt(0)) {
/*
* Appel reccursif vers le niveau inférieur
*/
return new ArbreLexicographique(((Noeud)noeudCourant).getSucc()).ajout(s.substring(1));
}
else if (((Noeud)noeudCourant).getInfo() > s.charAt(0)) break;
}
/*
* Noeud alternatif suivant
*/
noeudPrecedant = noeudCourant;
}
new ArbreLexicographique(noeudPrecedant).insereBrancheAlt(s);
return true;
}
boolean suppression(String s) {
// TODO
return false;
}
void sauve(String nomFichier) {
// TODO
}
void restaure(String nomFichier) {
// TODO
}
int nbMots() {
// TODO
return 0;
}
public NoeudA getRacine() {
return racine;
}
public String ToString() {
// TODO
return super.toString();
}
} |