Besoin d'aide svp

Besoin d'aide svp - Java - Programmation

Marsh Posté le 26-07-2006 à 15:53:27    

Salut à tous!
Voila mon problème :
 
Je suis en train de modéliser un arbre (binaire) en java.
J'ai donc une classe que l'on appelera arbre.
Pour les noeuds c'est un peu spécial, car il y a deux types de noeuds dans l'arbre. j'ai donc crée trois classes :
 - une classe Mère : Node
 - Deux classes Filles : InternalNode et LeafNode

Code :
  1. public class Node
  2. {
  3.     Node sonLeft;
  4.     Node sonRight;
  5.     .....
  6.     .....
  7. }


Code :
  1. public class LeafNode
  2. {
  3.     float [] donnee;
  4.     public LeafNode (Node sonLeft, Node sonRight, float[] donnee)
  5.     {
  6.     .....
  7. }


Code :
  1. public class InternalNode
  2. {
  3.     int donnee;
  4.     public LeafNode (Node sonLeft, Node sonRight, int donnee)
  5.     {
  6.     .....
  7. }


Code :
  1. public class Arbre
  2. {
  3.     Node root;
  4.     public Arbre (float[]donnee)
  5.     {
  6.         this.root = new LeafNode (null, null, donnee);
  7.     }
  8. }


 
et dans une fonction de la classe Arbre, il faudrait que je modifie les noeuds :

Code :
  1. public boolean Modif (float[] donnee, float[] donnee1, float[] donnee2, int axe)
  2. {
  3.      Node leNoeud = rechercheNoeud (donnee); // Fonction qui marche correctement
  4.      if (leNoeud != null)
  5.      {
  6.          Node sonLeft = new LeafNode (null, null, donnee1);
  7.          Node sonRight = new LeafNode (null, null, donnee2);
  8.          leNoeud = new internalNode (sonLeft, sonRight, axe);
  9.          return true;
  10.      }
  11.      return false;
  12. }


 
Le problème est que lorsque j'appelle cette fonction Modif, je n'ai pas les résultats des modifications (par exemple j'initialise avec le noeud root et après l'appel de cette fonction le noeud root est encore un noeud feuille alors que je voudrais qu'il soit du type InternalNode).
Je comprends très bien le problème puisqu'à mon avis à la fin de cette fonction les variables (leNoeud, sonLeft et sonRight) sont détruites ce qui fait que je ne récupère rien.
 
Mais je ne vois pas comment faire pour pouvoir récupérer tout ce que je veux (en C++, j'utiliserai des pointeurs mais la...).
 
Voila j'espere que je me suis bien fait comprendre et si quelqu'un sait comment faire, je suis preneur!
Merci d'avance!

Reply

Marsh Posté le 26-07-2006 à 15:53:27   

Reply

Marsh Posté le 26-07-2006 à 16:01:41    

Il est etrange ton arbre.
Je vois pas l'interet de la classe internalNode
 
 
Sinon en java, tout est refence.
 
 
Tu veux faire quoi ? modifie leNoeud ? alors il ne faut pas faire un new dans ton if, mais plutot faire un set sur les propretes que tu veux changer

Code :
  1. public boolean Modif (float[] donnee, float[] donnee1, float[] donnee2, int axe)
  2.     {
  3.         Node leNoeud = rechercheNoeud (donnee); // Fonction qui marche correctement
  4.         if (leNoeud != null)
  5.         {
  6.             Node sonLeft = new LeafNode (null, null, donnee1);
  7.             Node sonRight = new LeafNode (null, null, donnee2);
  8.          
  9. leNoeud.setFilsGauche(sonLeft);
  10. leNoeud.setFilsDroit(sonRight);
  11. // etc
  12.             return true;
  13.         }
  14.         return false;
  15.     }


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 26-07-2006 à 16:07:33    

En fait la classe InternalNode me sert parce que je n'ai pas le meme type de donnée entre LeafNode et InternalNode (dans LeafNode mon type de donnée est un tableau de float et dans l'autre, c'est un entier).  
J'ai voulu faire ca plus proprement, mais je pourrai peut-etre faire juste une seule classe ou j'aurais trois variables :
- une qui m'indique quel est le type du noeud
- un tableau de float (utilisé par exemple quand la première variable est à vrai)
- un entier (utilisé inversement quand la première variable est à false)
 
Je pense que ca devrait marcher mais je ne sais pas si c'est le meilleur choix......

Reply

Marsh Posté le 26-07-2006 à 16:10:26    

mais pourquoi dans l'un c'est des entiers et l'autre des float ?
 
(mais ton probleme ne vient pas de la, soit dis en passant)


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 26-07-2006 à 16:22:37    

C'est juste que dans l'arbre je stocke deux types de données.  
Petit résumé rapide (ca risque de pas etre très clair car moi j'ai du mettre 3 semaines a comprendre tout ca) :
J'ai un premier arbre qui stocke des données sous forme de tableaux d'entiers.
Lorsque dans ce premier arbre je veux insérer une nouvelle donnée (nouveau tableau donc), et qu'il n'y a plus de place sur le noeud (un noeud peut avoir par exemple 3 entrées qui contiennent chacune une donnée), je dois "séparer" ces données pour les insérer sur deux noeuds.
Pour les séparer, je fais/calcule une "représentation graphique" en n dimensions (suivant les dimensions du tableau) et je choisis la meilleure répartition en fonction d'un "axe" sur la représentation.
 
Lorsque ceci a été fait, dans mon arbre binaire, j'insère sur un noeud le numéro de l'axe et les deux fils de ce noeud contiennent les répartitions.  
 
Voila je sais pas si j'ai été clair.
 
Sinon t'as pas d'idées sur comment je pourrai résoudre mon problème stp?

Reply

Marsh Posté le 26-07-2006 à 16:26:50    

merci de mettre un titre correct à ton topic.


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 27-07-2006 à 17:23:12    

mick8569 a écrit :

En fait la classe InternalNode me sert parce que je n'ai pas le meme type de donnée entre LeafNode et InternalNode (dans LeafNode mon type de donnée est un tableau de float et dans l'autre, c'est un entier).  
J'ai voulu faire ca plus proprement, mais je pourrai peut-etre faire juste une seule classe ou j'aurais trois variables :
- une qui m'indique quel est le type du noeud
- un tableau de float (utilisé par exemple quand la première variable est à vrai)
- un entier (utilisé inversement quand la première variable est à false)
 
Je pense que ca devrait marcher mais je ne sais pas si c'est le meilleur choix......


 
La solution t'a été donnée dans le message précédent.
Utilise des getter et des setter pour modifier les attributs leNoeud,sonLeft et sonRigth  
ou bien ne redeclare pas une variable portant le meme nom que tes attributs

Code :
  1. 1.
  2.       public boolean Modif (float[] donnee, float[] donnee1, float[] donnee2, int axe)
  3.  
  4.          {
  5.  
  6.              Node leNoeud = rechercheNoeud (donnee); // Fonction qui marche correctement
  7.  
  8.              if (leNoeud != null)
  9.  
  10.              {
  11.  
  12.                  Node sonLeft = new LeafNode (null, null, donnee1);
  13.  
  14.                   Node sonRight = new LeafNode (null, null, donnee2);
  15.          
  16.       leNoeud.setFilsGauche(sonLeft);
  17.       leNoeud.setFilsDroit(sonRight);
  18.   this. setLeNoeud(leNoeud);
  19.                  return true;
  20.             }
  21.              return false;
  22.          }


 
voila

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed