Bonsoir à tous et tous mes voeux de bonheur à ceux qui me liront.

Je suis à essayer d'implémenter en java swing, la construction d'un arbre AVL.

Ma fenetre d'accueil une JPanel, fonctionne.

Ma seconde fenetre, reçois le premier entier saisi et construit ma racine de l'arbre.

Cela ne fonctionne pas lorsque je souhaite saisir un second entier et l'ajouter à mon arbre déjà créé. Il ne se passe plus rien.

La fonction ajouter ne fonctionne qu'une seule fois.

Il faut déjà que je réussisse à construire un arbre, donc les feuilles (class Noeud) pour travailler mes autres fonctions (supprimer, rechercher et effacer).

Je vous joins mon travail, pour ceux qui pourront m'aider.

Je réalise ce projet pour une amie, qui a beaucoup de mal avec Java, mais je ne suis pas une pro moi non plus.

Merci de votre collaboration et de vos astuces.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
package Arbre;
 
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.border.*;
import java.awt.event.ActionEvent;
 
 
 
  public class FenetreAccueil
	extends JPanel
	  implements ActionListener{  
 
  static ClassCommune F = new ClassCommune("Bienvenue dans mon espace gestion d'arbre AVL",1020,750);
 
  //créé un panel sans titre et son bouton positionné en haut
  JPanel jph = new JPanel(); 
  JButton demarrer = new JButton();   
 
  //créé un label avec une image
  JLabel img = new JLabel();
  Border border1;
  TitledBorder titledBorder1;
 
  //créé un label avec ma signature
  JLabel jls = new JLabel();
 
  //créé un panel sans titre et son bouton positionné en bas
  JPanel jpb = new JPanel();  
  JButton quitter = new JButton();
 
  JOptionPane confirm;
 
  //constructeur
  public FenetreAccueil() {
    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
 
    F.close.addActionListener(this);
 
    F.close.setEnabled(true);
 
    F.getContentPane().add(this,BorderLayout.CENTER);
    F.setVisible(true);
  }
 
  //main
  public static void main(String[] args) {
 
	  FenetreAccueil a1 = new FenetreAccueil();
  }
 
  //Initialisation des variables
  private void jbInit() throws Exception  {
 
	jph.setBackground(Color.gray);
	jph.setBorder(BorderFactory.createEtchedBorder());
	jph.setDoubleBuffered(true);
	jph.setBounds(new Rectangle(250, 30, 520, 54));
	jph.setLayout(null);
	demarrer.setBounds(new Rectangle(10, 7, 500, 40));
	demarrer.setText("Cliquer sur ce bouton pour commencer la construction de l'arbre");    
	demarrer.addActionListener(this); //ecouteur
	jph.add(demarrer, null);
	this.add(jph, null);
 
	border1 = new EtchedBorder(EtchedBorder.RAISED,Color.white,new Color(134, 134, 134));
    titledBorder1 = new TitledBorder(border1,"");
    this.setLayout(null);
 
    img.setBackground(Color.white);
    img.setBorder(titledBorder1);
    img.setBounds(new Rectangle(60, 120, 870, 410));
    img.setIcon(new ImageIcon("c:\\arbre.jpg"));
    this.add(img, null);
 
    jls.setText("A.Descargues Tous Droits Réservés © 2008-2009");
    jls.setBounds(new Rectangle(220, 590, 300, 25));
    this.add(jls, null);
 
	jpb.setBackground(Color.gray);
	jpb.setBorder(BorderFactory.createEtchedBorder());
	jpb.setDoubleBuffered(true);
	jpb.setBounds(new Rectangle(720, 580, 150, 54));
	jpb.setLayout(null);	
	quitter.setBounds(new Rectangle(10, 7, 130, 40));
	quitter.setText("Quitter");
	quitter.setIcon(new ImageIcon("c:\\quitter.gif"));
	quitter.addActionListener(this); //ecouteur
	jpb.add(quitter, null);
	this.add(jpb, null);        
  	}  
 
  void quitter_actionPerformed() {	  
	      System.exit(0);
	    }
 
  void demarrer_actionPerformed(){
	    F.setEnabled(false);
	    new Arbre();
	 }
 
 
  public void actionPerformed(ActionEvent ae) {
    if(ae.getSource()==quitter || ae.getSource()==F.close){
      quitter_actionPerformed();
    }
    else if(ae.getSource()==demarrer){
        demarrer_actionPerformed();
    }    
  }
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
package Arbre;
 
/*Cette classe contient les elements communs pour les frames*/
 
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
 
 
public class ClassCommune
    extends JFrame {
 
 
static Font titreFont=new Font("Algerian", 1, 20);//font du titre peut etre modifier a partir de options affichage
 
  JLabel titre; //titre du frame
 
  JPanel titre_pn;
 
  JMenuBar m = new JMenuBar(); //la barre du menu
 
  JMenu file = new JMenu("Fichier"); //le menu fichier  
 
  JMenuItem close = new JMenuItem("Quitter"); //l'element Quitter
 
 
  public ClassCommune(final String Title, final int L, final int H) {
 
    titre = new JLabel(Title);
    titre.setFont(titreFont); //definir le font du titre
    titre.setForeground(Color.DARK_GRAY);
 
    titre_pn = new JPanel();
    titre_pn.add(titre);
    getContentPane().add(titre_pn, BorderLayout.NORTH);
 
    setTitle(Title); //definir le titre du frame
    setSize(L, H); //definir la taille du frame
    setLocation(1,1);
 
 
    close.setEnabled(false);
 
 
 
    file.addSeparator();
    file.add(close);
 
 
    //ajouter les menus a la barre
    m.add(file);
 
    //Ajouter la barre a la frame
    setJMenuBar(m);
    //
    //fermeture de la frame accueil
    addWindowListener(new WindowAdapter() {
      public void windowClosing(final WindowEvent evt) {
        FenetreAccueil.F.setEnabled(true);
      }
    });
 
    setResizable(false);
    setVisible(true);
  }
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
package Arbre;
 
import java.awt.*;
import javax.swing.*;
 
public class MonJLabel extends JLabel{
  static Font font=new Font("Arial",0,12);
  public MonJLabel(String titre) {
    super(titre);
    setFont(font);
  }
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
package Arbre;
 
 
import java.awt.*;//paquetage pour les interfaces graphiques
import java.awt.event.*;//paquetage contenant les outils de gestion d'évènements
import java.util.*;//paquetage contenant la classe Stack = pile implémentée en java.
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
 
 
/** Classe Arbre
  * dont le but est la gestion d'un arbre binaire de recherche
  * équilibré "AVL". Elle comporte des méthodes de rotations, d'adjonction
  * de suppression, de recherche d'élément dans un avl et d'effacement de l'arbre.
  */
 
public class Arbre
	extends ClassCommune 
		implements ActionListener//gestion des boutons
{
 
	// Attributs 
	private Noeud racine;//noeud racine de l'arbre
	private JButton ajouter,supprimer,rechercher,effacer,quitter;
	private MonJLabel ent_lb;
	private JTextField ent;	
	private Stack pile;
	private String warning;
	private int warn;	
 
	private JPanel entier_pn, dessin_pn, neutre_pn, bouton_pn; //le  panel du frame
 
	private JOptionPane confirm;
 
	//Constructeur
	  public Arbre() {
 
	    super("Saisir un entier et cliquer sur les icones de votre choix pour commencer la construction", 1020, 750);
 
	    //definir le champs de saisie
	    ent_lb = new MonJLabel("L'entier doit être compris entre 0 et 99");
	    ent	= new JTextField(2);	    
 
	    //definir les bouttons
	    ajouter = new JButton("Ajouter un entier");
	    ajouter.setIcon(new ImageIcon("c:\\panier.gif"));
	    ajouter.addActionListener(this);	    
	    supprimer = new JButton("Supprimer un entier");
	    supprimer.setIcon(new ImageIcon("c:\\supprimer.gif"));
	    supprimer.addActionListener(this);
	    rechercher = new JButton("Rechercher un entier");
	    rechercher.setIcon(new ImageIcon("c:\\recherche.gif"));
	    rechercher.addActionListener(this);	    
	    effacer = new JButton("Effacer l'arbre");
	    effacer.setIcon(new ImageIcon("c:\\effacer.jpg"));
	    effacer.addActionListener(this);
	    quitter = new JButton("Quitter l'application");
	    quitter.setIcon(new ImageIcon("c:\\quitter.gif"));
	    quitter.addActionListener(this);
 
 
	    //** ajout des elements dans le panel	    
 
 
	    entier_pn = new JPanel();
	    entier_pn.add(ent_lb);	    
	    entier_pn.add(ent);	    
 
	    dessin_pn = new JPanel();    
	    Border border1;
	    TitledBorder titledBorder1;
	    border1 = new EtchedBorder(EtchedBorder.RAISED,Color.white,new Color(134, 134, 134));
	    titledBorder1 = new TitledBorder(border1,"Espace construction d'un arbre AVL");
	    dessin_pn.setBackground(Color.white);
	    dessin_pn.setBorder(titledBorder1);
	    dessin_pn.setBounds(new Rectangle(60, 300, 870, 280));
	    this.add(dessin_pn, null);
 
	    neutre_pn = new JPanel();
 
 
	    bouton_pn = new JPanel();
	    bouton_pn.add(ajouter, BorderLayout.NORTH);
	    bouton_pn.add(supprimer, BorderLayout.NORTH);
	    bouton_pn.add(rechercher, BorderLayout.NORTH);
	    bouton_pn.add(effacer, BorderLayout.NORTH);
	    bouton_pn.add(quitter, BorderLayout.NORTH);
 
 
	    //** ajout des panels dans la frame
	    getContentPane().add(entier_pn, BorderLayout.WEST);
	    getContentPane().add(dessin_pn, BorderLayout.CENTER);
	    getContentPane().add(neutre_pn, BorderLayout.EAST);
	    getContentPane().add(bouton_pn, BorderLayout.SOUTH);
	    setResizable(false);
	    setVisible(true);
 
	  }
 
 
	/// Méthodes 
	public Noeud RG(Noeud A)
	/** rotation gauche de l'arbre dont la racine est le noeud A
          * précondition: A != null et A.fd != null
          */
	{
		Noeud temp=null;
		if ((A==null)||(A.fd==null)) return A;
		else{
			temp = A.fd;
			Noeud.remonte(temp);
			A.fd = temp.fg;
			repaint();
			pause(100);
			Noeud.descend(A);
			temp.fg = A;
			A=temp;
			repaint();
			pause(100);
			Noeud.setD(A);
			return A;
		}
	}
 
	public Noeud RD(Noeud A)
	/** rotation droite de l'arbre dont la racine est le noeud A
          * précondition: A != null et A.fg != null
          */
 
	{
		Noeud temp=null;
		if ((A==null)||(A.fg==null)) return A;
		else{
			temp = A.fg;
			Noeud.remonte(temp);
			A.fg = temp.fd;
			repaint();
			pause(100);
			Noeud.descend(A);
			temp.fd = A;
			A = temp;
			repaint();
			pause(100);
			Noeud.setD(A);
			return A;
		}
	}
 
	public Noeud RGD(Noeud A)
	/** rotation gauche-droite de l'arbre dont la racine est le noeud A
          * précondition: A != null et A.fg != null et A.fg.fd != null
          */
	{
		A.fg=RG(A.fg);
		return RD(A);
	}
 
	public Noeud RDG(Noeud A)
	/** rotation droite-gauche de l'arbre dont la racine est le noeud A
          * précondition: A != null et A.fd != null et A.fd.fg != null
          */
	{
		A.fd=RD(A.fd);
		return RG(A);
	}
 
 
	private Noeud reequilibrer(Noeud A)
	/**rééquilibrage partiel de l'arbre dont la racine est le noeud A 
          */
	{
	   if (A!=null)
	   {
		   if (A.d==-2)
		   {
			   if ((A.fd.d==-1)||(A.fd.d==0)) A=RG(A);
			   else if(A.fd.d==1) A=RDG(A);
		   }
		   else if(A.d==2)
		   		{
					if ((A.fg.d==0)||(A.fg.d==1)) A=RD(A);
					else if (A.fg.d==-1) A=RGD(A);
				}
 
		Noeud.setD(A);
	   }
	   return A;
	}
 
	private boolean equilibre(Noeud A)
	/** retourne vrai si abs(A.d)<2 et faux sinon
          * précondition A != null
          */
	{
		int i = A.d;
		return ((i<2)&&(i>-2));
	}
 
	public Noeud add(int x,Noeud A,int h,Stack p)
	/** adjonction de l'entier x dans l'arbre dont le noeud racine est A
          */
	{
		Noeud n=new Noeud(x);//création du noeud à ajouter
		Noeud temp,temp2;
		if (A==null) {
			A=n;//ajout
			warn = 2;
			return A;
		}
		else
		{
			temp=A;
			while ((temp != null)&&(temp.info.intValue()!=x))
			//parcours de l'arbre en empilant les noeuds rencontrés
			{
				p.push(temp);
				h++;
			    if (x>temp.info.intValue()) temp=temp.fd;
			    else if (x<temp.info.intValue()) temp=temp.fg;
			}
			if (temp!=null) {warn = 3;return A;}
			else{
				n.h=h;//ajustement de la hauteur
				Noeud t=(Noeud)p.peek();//récupération du père du noeud à ajouter
				if (x<t.info.intValue()) {t.fg=n;warn = 2;}//ajout
				else if (x>t.info.intValue()) {t.fd=n;warn=2;}//ajout
				Noeud.setD(A);//ajustement du déséquilibrage
				repaint();
				while ((! p.empty())&&(equilibre((Noeud)p.peek())))
				//remontée de l'arbre à la recherche du premier noeud déséquilibré
				{
					temp=(Noeud)p.pop();
				}
				//réequilibrage
				if (! p.empty())
				{
					temp=(Noeud)p.pop();
					//noeud.setD(temp);
					//System.out.println("reequilibrage du noeud "+temp.info.toString()+" "+temp.d);
		 			temp=reequilibrer(temp);
					if (! p.empty())
					{
						temp2=(Noeud)p.peek();
						if (temp.info.intValue()<temp2.info.intValue()) temp2.fg=temp;
						else temp2.fd=temp;
					}
					else A=temp;
				}
				p.clear();//nettoyage de la pile
				Noeud.setD(A);//ajustage du déséquilibrage
				return A;
			}
		}
	}
 
	private int getMax(Noeud A)
	/** retourne le plus grand élément de l'arbre ayant A pour noeud racine
          * précondition A != null
          */
	{
		if(A.fd == null) return A.info.intValue();
		else return getMax(A.fd);
	}
 
	private Noeud supmax(Noeud A)
	/** retourne l'arbre dont A est le noeud racine privé de son plus grand élément
          * précondition: A != null
          */
	{
		if (A.fd==null) return A.fg;
		else
		{
			A.fd=supmax(A.fd);
			Noeud.setD(A);
			return reequilibrer(A);
		}
	}
 
	public Noeud suppAVL(int x,Noeud A)
	{
		int max=-1;
		int test = Noeud.getTaille(A);
		Noeud temp=null;
		if (A!=null)
				if (x==A.info.intValue())
					if (A.fd==null) {temp = A.fg;warn=4;}
					else if (A.fg==null) {temp = A.fd;warn=4;}
						 else
						 {
							 max = getMax(A.fg);
							 A.fg = supmax(A.fg);
							 A.info = new Integer(max);
							 Noeud.setD(A);
							 temp = reequilibrer(A);
							 warn=4;
						 }
				else if (x<A.info.intValue())
					 {
						 A.fg = suppAVL(x,A.fg);
						 Noeud.setD(A);
						 temp = reequilibrer(A);
					 }
					 else
					 {
						 A.fd = suppAVL(x,A.fd);
						 Noeud.setD(A);
						 temp = reequilibrer(A);
					 }
			else{temp=null;}
			if (Noeud.getTaille(temp)==test) warn=5;
			return temp;
	}
 
	/// Méthodes de dessin 
    public void drawNode(String s, int x, int y, Graphics g, Color c1, Color c2)
    //dessin d'un noeud
    {
		g.setColor(c1);
		g.fillOval(x,y,22,22);
		g.setColor(c2);
		g.fillOval(x+2,y+2,18,18);
		g.setColor(c1);
		g.drawString(s,x+6,y+16);
    }
 
	public void dessinArbre(Graphics g, Noeud A, int posX, int posY, int pasX, int pasY)
	//dessin d'un arbre
	{
		if (A != null)
		{
			if (A.fg != null)
			{
				g.drawLine(posX+10,posY+20,posX-pasX/2,posY+pasY);
				g.drawLine(posX+11,posY+20,posX+1-pasX/2,posY+pasY);
				dessinArbre(g,A.fg,posX-pasX/2-10,posY+pasY,(int)(pasX*0.5),pasY);
			}
			if (A.info.intValue()<10)
				drawNode("0"+A.info.toString(),posX,posY,g,Color.black,Color.yellow);
			else drawNode(A.info.toString(),posX,posY,g,Color.black,Color.yellow);
			g.drawString(String.valueOf(A.d),posX+5,posY-10);
			pause(100);
 
			if (A.fd != null)
			{
				g.drawLine(posX+10,posY+20,posX+10+pasX/2,posY+pasY);
				g.drawLine(posX+11,posY+20,posX+9+pasX/2,posY+pasY);
				dessinArbre(g,A.fd,posX+pasX/2,posY+pasY,(int)(pasX*0.5),pasY);
			}
		}
	}
 
	public void paint(Graphics g)
	{
		g.setColor(Color.black);
		switch(warn)
		{
			case 0: warning = "entre 0 et 99!!";g.drawString(warning,5,40);break;
			case 1: warning = "donnez un entier entre 0 et 99!!";g.drawString(warning,5,40);break;
			case 2: warning = "ajout entier éffectué";g.drawString(warning,5,40);break;
			case 3: warning = "valeur déja présente";g.drawString(warning,5,40);break;
			case 4: warning = "suppression entier effectuée";g.drawString(warning,5,40);break;
			case 5: warning = "valeur non présente";g.drawString(warning,5,40);break;
			case 6: warning = "l'équilibre n'est plus garanti !!";g.drawString(warning,5,40);break;
		}
		if (racine != null)
		  dessinArbre(g,racine,600,150,350,50);
	}
 
	// Methode de gestion des évènements liés aux boutons 
 
	public void actionPerformed(ActionEvent e)
	{
		int i;
		if (e.getActionCommand().equals("Ajouter un entier"))
		{
			try{
				i=Integer.parseInt(ent.getText());
			}catch(NumberFormatException ev)
			{i=-1;}
			if ((i<0)||(i>99)) warn = 1;
			else
			{
				racine=add(i,racine,0,pile);
			}
			ent.setText("");
 
		}
		else if (e.getActionCommand().equals("Quitter l'application")) {System.exit(0);}
		else if (e.getActionCommand().equals("Effacer l'arbre")) {racine=null;warn = 0;}	 
			 	  	   			 else
								 {
									try{
										i=Integer.parseInt(ent.getText());
									}catch(NumberFormatException ev)
									{i=-1;}
									if ((i<0)||(i>99)) warn=1;
									else
									{
										racine=suppAVL(i,racine);
									}
									ent.setText("");
								 }
		repaint();
	}
 
	public void pause(int time)
	{
		try{
			Thread.sleep(time);
		}catch(InterruptedException e){}
	}
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
package Arbre;
 
 
/** Classe Noeud,
 * elle représente une modélisation de structure de noeud
 * d'un arbre binaire de recherche.
 */
 
public class Noeud
{
	Integer info=null;
	Noeud fg=null;//fils gauche
	Noeud fd=null;//fils droit
	int h=0;//hauteur d'un noeud
	int d=0;//déséquilibre
 
	public Noeud(int i)
	{
		info = new Integer(i);
		fg = null;
		fd = null;
		d = 0;
	}
 
	public boolean testFeuille()
	/** teste si un noeud est une feuille 
          */
	{
		return ((info != null)&&(fg == null) && (fd == null));
	}
 
	public static int getH(Noeud A)
	/** retourne la hauteur d'un arbre
          */
	{
		if (A==null) return -1;
		else if (A.testFeuille()) return 0;
			 else return 1+Math.max(A.getH(A.fg),A.getH(A.fd));
	}
 
	public static int getD(Noeud A)
	/** retourne le déséquilibre d'un noeud
          */
	{
		return getH(A.fg)-getH(A.fd);
	}
 
	public static void setD(Noeud A)
	/** réajuste le déséquilibre de chaque noeud interne ou simple de A
          */
	{
		A.d = getD(A);
		if (A.fg!=null) setD(A.fg);
		if (A.fd!=null) setD(A.fd);
	}
 
	public static void remonte(Noeud A)
	/** réajuste la hauteur de chaque noeud interne ou simple de A
          */
	{
		if (A!=null)
		{
			A.h-=1;
			remonte(A.fg);
			remonte(A.fd);
		}
	}
 
	public static void descend(Noeud A)
	/** réajuste la hauteur de chaque noeud interne ou simple de A
          */
	{
		if (A!=null)
		{
			A.h+=1;
			descend(A.fg);
			descend(A.fd);
		}
	}
 
	public static int getTaille(Noeud A)
	/** retourne la taille de l'arbre en instance
          */
	{
		if (A==null) return 0;
		else
			return 1+getTaille(A.fg)+getTaille(A.fd);
	}
 
	public static boolean rechercher(int o, Noeud A)
	{
		if (A==null) return false;
		else{
			if (o==A.info.intValue()) return true;
			else
				if (o<A.info.intValue()) return rechercher(o,A.fg);
				else return rechercher(o,A.fd);
		}
	}
}
Au plaisir de vous lire et bonne soirée.