Implementation arbre

Résolu
khaoula_ba Messages postés 6 Statut Membre -  
khaoula_ba Messages postés 6 Statut Membre -
bonjour, je cherche à construire un arbre appelé in_tree dans lequel chaque noeud a au plus un successeur et un nb quelconque de predecesseurs.

je cree une classse et une methode comme suivant
public class Arbre {
    
    public Arbre succ;
    public Arbre [] pred;
    public static int Numniveau;//niveau du noeud 
    public int val;//le nom de la tache qui est 1 ou 2 ou 3
    public int poids=0;
    public boolean feuille;//si le noeud courent est feuille alors feuille =true sinn false
                           //une feuille est un noeud qui ne posséde aucun predecesseur
    public Arbre()
    {succ=null;
    val=1;
    Numniveau=1;
    feuille=false;
    }
   
    
    int k=1;
    
    public void generate(Arbre racine,int nb_pred_max,int nb_niveaux)//nb_pred_max c'est le nombre max de predecesseurs d'un noeud donné en parametre 
    {
        if (racine.Numniveau<nb_niveaux)
    {  int n=(int) (Math.random() * nb_pred_max + 1);
     racine.pred=new Arbre[n];
     for(int i=0;i<racine.pred.length;i++)
     {k++;//pour assurer l'obtention de taches distinctes
         racine.pred[i]=new Arbre();
         racine.pred[i].Numniveau=racine.Numniveau+1;
         racine.pred[i].succ=racine;
         racine.pred[i].val=k;
         generate(racine.pred[i],nb_pred_max,nb_niveaux);
         
         }
    }
    else
        racine.feuille=true;
    }
             
    }


le probléme que ma procedure boucle infiniment à cause de la recursivité mais je trouve pas comment corriger.

3 réponses

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    public static int Numniveau;//niveau du noeud 
    Il n'y a aucune raison que ceci soit static (c'est à dire commun à tous les arbres que tu vas créer), de plus ce genre d'information n'a pas à être stockée dans la structure, elle devrait être calculée par une méthode. Donc ta condition principale "if (racine.Numniveau<nb_niveaux)" est à revoir !

    public boolean feuille;//si le noeud courent est feuille alors feuille =true sinn false

    Idem, cette information se calcule (avec pred==null) pas besoin de la stocker.

    Il faudrait aussi revoir l'encapsulation, tout mettre à public est une mauvaise idée !

    public int val;//le nom de la tache qui est 1 ou 2 ou 3
    Tu pourrais utiliser un enum, ce serait plus sûr pour restreindre les valeurs possibles.
    public static enum Tache { T1, T2, T3};
    protected Tache val;


    int k=1;
    Si ça ne fait pas partie de la structure de l'arbre, alors ça n'a rien à faire ici !

    //une feuille est un noeud qui ne posséde aucun predecesseur
    Si c'est une feuille tu devrais avoir un successeur non null, ici en fait c'est une racine que tu construis !
    Remarque : avec les arbres le vocabulaire consacré est plutôt de parler d'un père et de plusieurs fils (pas de successeur et de prédécesseurs...)

    Bref, il y a beaucoup de choses à revoir, en commençant par la structure de l'arbre !

    public class Arbre
    {
        protected Arbre pere;
        protected Arbre[] fils;
    
        public static enum Tache {T1, T2, T3};
        protected Tache val;
        protected int poids;
    0
  2. khaoula_ba Messages postés 6 Statut Membre
     
    merciiiiiiiiiiiii

    wi c'est ca , il me suffit d'enlever le mot statich et ca marche
    0
  3. khaoula_ba Messages postés 6 Statut Membre
     
    bonsoir,
    je cherche à affecter à chaque noeud un poids qui represente le nombre de predecesseurs total de chaque noeud.

    si c'est une feuille son poids est egal à 1 sinn sommes des poids de ses predecesseurs directs

    pour ceci j'ai implémenté:
    
      public int somme_poids(Arbre racine)
        {int x=1;
        for(int i=0;i<racine.pred.length;i++)
        { x=x+racine.pred[i].poids;}
        return x;
        }
                
                
      public void affecter_poids(Arbre racine)
       {
            if(racine.feuille==true) {racine.poids=1; }
            else
            {
                for(int j=0;j<racine.pred.length;j++)
                {
                    affecter_poids(racine.pred[j]);
                }
                racine.poids=somme_poids(racine);
            }
        }
    

    mais ca ne marche pas correctement

    pouvez vous m'aider svp?????

    cé urgent. et merci d'avance
    0