-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathArbreBinaireC.java
387 lines (270 loc) · 9.05 KB
/
ArbreBinaireC.java
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
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
/**
* ArbreBinaireC.java
* 13 juin 2024
* @author Yamine Ibrahima
*/
package arbres;
import java.util.ArrayList;
import java.util.List;
import deque.Deque_y;
/**
* Cette classe représente un arbre binaire implémenter avec une structure chainée.
*
* @author Yamine Ibrahima
*/
public class ArbreBinaireC<E> implements ArbreBinaire<E> {
//ATTRIBUTS - FIELDS
protected BSNoeud<E> racine;
protected List<BSNoeud<E>> nodelist ; //Liste de tous les noeuds de l'arbre
//CONSTRUCTEURS
/**
* Construit un arbre binaire ayant une racine
* */
public ArbreBinaireC (E rootdata) {
this.racine = new BSNoeud<E>(rootdata);
this.nodelist = new ArrayList<BSNoeud<E>>();
this.nodelist.add(racine);
}
/**
* Construit un arbre binaire vide
* */
public ArbreBinaireC() { this(null);}
/**
* Renvoie le data stocké par la racine
* */
public E getRacine() { return this.racine.data; }
/**
* Set la racine uniquement si l'arbre est vide
* */
protected void setRacine(E rootdata) {
this.racine = (this.racine.data == null)? new BSNoeud<E>(rootdata) : this.racine ;
this.nodelist.set(0, racine);
}
/**
* @return the nodelist
*/
public List<BSNoeud<E>> getNodelist() { return nodelist; }
/**
* Vérifie si l'arbre est vide
* */
public boolean isEmpty() { return this.racine.data == null; }
/**
* Recherche un noeud dans l'arbre
* */
@Override
public E rechercherNoeud(E element) {
return (contains(this.racine, element) ? element : null);
}
/**
* Parcours en "level-order" le sous-arbre dont la racine est source
* et vérifie s'il existe un noeud dont le data est element
* @param source le noeud à partir duquel commencé le parcours
* @param element la data dont l'existence doit être vérifiée
* */
private boolean contains(BSNoeud<E> source, E element) {
if (this.isEmpty()) return false;
Deque_y <BSNoeud<E>> file = new Deque_y <BSNoeud<E>>();
file.enqueue(source);
BSNoeud<E> temp = null;
while(!file.isEmpty()) {
temp = file.dequeue();
//Vérifier si le data du noeud actuel correspond à l'élément recherché
if (temp.getData() == element) {
return true;
} else { //Sinon enfiler ses enfants
if(temp.getFilsgauche() != null)
file.enqueue(temp.filsgauche);
if(temp.getFilsdroit() != null)
file.enqueue(temp.filsdroit);
}
}
return false;
}
/**
* Insère un noeud dans l'arbre.
**/
@Override
public void insererNoeud(E data) {
// Si l'arbre est vide, set la racine
if(isEmpty()) {
this.setRacine(data);
return;
}
/*
* Si l'arbre n'est pas vide et qu'il existe déjà un noeud
* qui encapsule cette data, afficher un message et arrêter
* car il est proscrit d'avoir 2 noeuds avec la même donnée.
*
* */
if(rechercherNoeud(data) == data) {
System.out.println("Le noeud que vous souhaitez insérer existe déjà");
return;
}
/*
* S'il n'existe pas déjà un noeud avec cette data dans l'arbre,
* parcourir en largeur (BFS) l'arbre à partir de la racine et vérifier pour chaque noeud existant:
*
* Pour performer le parcours en BFS, il faut une file. J'utiliserai le deque que j'ai développé comme file
*
* Lors du parcours en BFS, si un noeud ne possède pas d'enfant, insérer
*
*
*
* */
Deque_y <BSNoeud<E>> file = new Deque_y <BSNoeud<E>>();
file.enqueue(this.racine);
BSNoeud<E> temp = null;
while(!file.isEmpty()) {
temp = file.dequeue();
//--------------------------------- Performer l'insertion
if(temp.getFilsgauche()==null) { // Si le fils gauche n'existe pas
temp.setFilsgauche(data); // Set avec le nouveau noeud
this.nodelist.add(temp.filsgauche);
return; // Sortir de le fonction pour éviter des duplicat
}else { //Dans le cas ou le fils de gauche existe
file.enqueue(temp.filsgauche); //Enfiler le fils gauche pour continuer le parcours
}
if(temp.getFilsdroit() == null) {
temp.setFilsdroit(data);
this.nodelist.add(temp.filsgauche);
return;
}else {
file.enqueue(temp.filsdroit); //Enfiler le fils droit pour continuer le parcours
}
}
}
/**---------------------------------------------------------------------------------------------------------------------------------------------------------------*/
/**
* Supprime un noeud si ce dernier n'a pas d'enfant
* */
@Override
public E supprimerNoeud(E e) {
//Vérifier que le noeud existe
if(this.rechercherNoeud(e) == null) {
throw new NullPointerException("Le noeud que vous essayez de supprimer n'existe pas !") ;
}
BSNoeud<E> deleted = suppression(this.racine, e);
if ( deleted != null && deleted.getData()==e) {
deleted.parent = null ;
deleted.filsgauche = null;
deleted.filsdroit = null ;
deleted.hauteur = -1;
deleted.data = null;
return e;
}
return null;
}
private BSNoeud<E> suppression(BSNoeud<E> source , E e){
// Pas implémenté
return null;
}
/**---------------------------------------------------------------------------------------------------------------------------------------------------------------*/
/**
* @return un string contenant le nombre de tabulation mentionné en paramètre
* @param nombre_tab nombre de tabulation désiré
* */
protected String tabuler(int nombre_tab) {
String tab = "\t";
for(int i = 0 ; i < nombre_tab; i++) {
tab += tab ;
}
return tab;
}
/**
*
* @return Une représentation textuelle (en level-order) de l'arbre
*
* */
public String toprint() {
String prompt = "";
Deque_y <BSNoeud<E>> file = new Deque_y <BSNoeud<E>>();
file.enqueue(this.racine);
BSNoeud<E> temp = null;
//Faire un for qui va jusqu'à la profondeur de l'arbre
while(!file.isEmpty()) {
temp = file.dequeue(); //Noeud current
if(temp != null) {
if (temp == this.racine) {
prompt += "Noeud : " + temp.getData().toString() + " \n"
+ "\tParent :" + " none " + " \n"
+ "\tHauteur : " + temp.getHauteur() + " \n----------------------";
}else {
prompt += "\nNoeud : " + temp.getData().toString() + " \n"
+ "\tParent :" + temp.getParent().toString() + " \n"
+ "\tHauteur : " + temp.getHauteur() + " \n----------------------" ;
}
if(temp.getFilsgauche()!=null) {
file.enqueue(temp.filsgauche);
}
if(temp.getFilsdroit() !=null) {
file.enqueue(temp.filsdroit);
}
}
/*
if(temp != null) {
prompt += whiteSpace(temp.getHauteur()) + " " + temp.getData().toString();
if(temp.getFilsgauche()!=null) {
file.enqueue(temp.filsgauche);
}
if(temp.getFilsdroit() !=null) {
file.enqueue(temp.filsdroit);
}
}
*/
}
prompt += " ";
return prompt;
}
//------------------------------------------------------------------------
/**
* Utiliser la méthode print à la place
* */
@Override
public String toString() {
//A modifier
return "ArbreBinaireC [racine=" + racine + ", nodelist=" + nodelist + "]";
}
/**
* Cette classe représente un noeud de l'arbre
* */
protected class BSNoeud<T> {
//Attributs
protected T data;
protected int hauteur ;
protected BSNoeud<T> parent;
protected BSNoeud<T> filsgauche;
protected BSNoeud<T> filsdroit;
//Constructeur
BSNoeud(T d) {
this.data = d;
this.filsgauche = null;
this.filsdroit = null;
this.parent = null;
}
public BSNoeud(T d, BSNoeud<T> p) {
this(d);
this.parent = p ;
this.hauteur = p.hauteur + 1;
}
//Getters
public T getData() { return this.data; }
public int getHauteur() { return this.hauteur ; }
public T getParent() { return (this.parent != null )? this.parent.data : null ; }
public T getFilsdroit() { return (this.filsdroit != null )? this.filsdroit.data : null ; }
public T getFilsgauche() { return (this.filsgauche != null )? this.filsgauche.data : null ; }
//Setters
void setFilsgauche(T data) {
this.filsgauche = new BSNoeud<T>(data , this);
}
void setFilsdroit(T data) {
this.filsdroit = new BSNoeud<T>(data, this);
}
@Override
public String toString() {
return "[data=" + data + ""
+ ", parent= " + ((parent != null )? parent.getData() : "null") + ""
+ ", filsgauche=" + ((filsgauche != null )? filsgauche.getData() : "null") + ""
+ ", filsdroit="+ ((filsdroit != null )? filsdroit.getData() : "null") + "]\n\t\t";
}
} // Fin classe Noeud
} //Fin de la classe ArbreBinaireC