Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1431 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  somme des noeuds d'un arbre

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

somme des noeuds d'un arbre

n°1636084
bibi182
Posté le 03-11-2007 à 16:20:46  profilanswer
 

Bonjour,
je dois écrire une fonction récursive static int somme(Arbin<Integer> a ) qui calcule et retourne la somme des valeurs des nœuds (de l’arbre binaire a) qui sont fils gauches d’un nœud de a. Par exemple la somme des noeuds en gras sur cet arbre:
http://images2.hiboox.com/images/4407/baqlsv5d.jpg
je galère!!
merci d'avance pour tout...

mood
Publicité
Posté le 03-11-2007 à 16:20:46  profilanswer
 

n°1636100
Taz
bisounours-codeur
Posté le 03-11-2007 à 17:16:45  profilanswer
 

91, facile

n°1636112
bibi182
Posté le 03-11-2007 à 18:09:47  profilanswer
 

tu m'aides pas trop...

n°1636124
masklinn
í dag viðrar vel til loftárása
Posté le 03-11-2007 à 18:51:06  profilanswer
 

En même temps, t'as pas posté de code, t'as pas posté la structure de l'arbre, t'as pas posté où tu bloquais exactement et tu nous a pas dit quelles pistes tu avais déjà explorées...
 
Donc il peut difficilement t'aider plus que ça, à part à la limite en te disant qu'un arbre ça s'explore récursivement.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1636135
bibi182
Posté le 03-11-2007 à 19:15:43  profilanswer
 

Ben l'arbre c'est un arbre binaire quelconque...
et j'ai quelques pistes:
 
static int somme(Arbin<Integer> a ) {
if(!a.estVide()) {
      return a.racine.intValue() + ag.somme(a.ag()); }
}
qu'en pensez-vous ?

n°1636136
masklinn
í dag viðrar vel til loftárása
Posté le 03-11-2007 à 19:24:05  profilanswer
 

J'en pense que j'ai oublié ma boule de crystal ce matin


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1636147
bibi182
Posté le 03-11-2007 à 19:47:20  profilanswer
 

Code :
  1. public Noeud<T> rac; //racine de l'arbre
  2. protected static class Noeud<U>() {
  3. public U val;
  4. public Noeud<U> fg;
  5. public Noeud<U> fd;
  6.  Noeud() {
  7.  this.val = null;
  8.  this.fg = null;
  9.  this.fd = null;
  10.  }
  11. }
  12.     ArbinCh()
  13.     {
  14.         this.rac = null;
  15.     }
  16.     ArbinCh(T v)
  17.     {
  18.         this.rac = new Noeud();
  19.         this.rac.val = v;
  20.     }
  21.     ArbinCh(T v, Arbin<T> ag, Arbin<T> ad)
  22.     {
  23.         this.rac = new Noeud();
  24.         this.rac.val = v;
  25.         this.rac.fg = (ArbinCh) ag.rac;
  26.         this.rac.fd = (ArbinCh) ad.rac;
  27.     }
  28.     public ArbinCh<T> ag()
  29.     {
  30.         ArbinCh<T> res = new ArbinCh();
  31.         res.rac = this.rac.fg;
  32.         return res;
  33.     }
  34.     public ArbinCh<T> ad()
  35.     {
  36.         ArbinCh<T> res = new ArbinCh();
  37.         res.rac = this.rac.fd;
  38.         return res;
  39.     }
  40.     public boolean avide()
  41.     {
  42.         return this.rac == null;
  43.     }
  44.     public Noeud<T> racine()
  45.     {
  46.         return this.rac;
  47.     }
  48. --------------------------------------------------------
  49. public abstract class Arbin<T> {
  50.     public abstract T racine();
  51.     public abstract Arbin<T> ad();
  52.     public abstract Arbin<T> ag();
  53.     public abstract boolean estVide();
  54.     public abstract Arbin<T> initArbre(T v, Arbin<T> g, Arbin<T> d);
  55.     public abstract Arbin<T> initArbre();

n°1636154
masklinn
í dag viðrar vel til loftárása
Posté le 03-11-2007 à 20:05:09  profilanswer
 

Comment tu fais pour avoir besoin de 3 classes différentes pour un pauvre arbre [:petrus dei]

 

Et c'est quoi l'intérêt d'utiliser des noms aussi cryptique que 'ad' et 'ag', peur de s'user les doigts [:petrus dei]

 

Et pourquoi il en manque des bouts [:petrus dei]


Message édité par masklinn le 03-11-2007 à 20:05:23

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1636155
bibi182
Posté le 03-11-2007 à 20:16:55  profilanswer
 

Code :
  1. public abstract class Arbin<T> {
  2.     public abstract T racine();
  3.     public abstract Arbin<T> ad();    //sous-arbre droit
  4.     public abstract Arbin<T> ag();    //sous-arbre gauche
  5.     public abstract boolean estVide(); }


 
aidez-moi svp... c'est un arbre binaire équilibré (l'exemple n'était que pour vous montrez les noeuds que l'on cherchent)
si e est un Integer, alors e.intValue() donne la valeur de type int correspondante.  
j'ai écris ça, est-ce que ça convient ?
 

Code :
  1. static int somme(Arbin<Integer> a ) {
  2. if(!a.estVide()) {
  3.       return a.racine().intValue() + ag.somme(a.ag()); }
  4. }


Message édité par bibi182 le 03-11-2007 à 20:21:02
n°1636157
masklinn
í dag viðrar vel til loftárása
Posté le 03-11-2007 à 20:20:33  profilanswer
 

non


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
mood
Publicité
Posté le 03-11-2007 à 20:20:33  profilanswer
 

n°1636162
bibi182
Posté le 03-11-2007 à 20:31:23  profilanswer
 

si tu dis non c'est que t'as une idée alors...
aide moi sinon passe ton chemin car tu ne fais que de me remballer :/

n°1636164
masklinn
í dag viðrar vel til loftárása
Posté le 03-11-2007 à 20:37:09  profilanswer
 

bibi182 a écrit :

si tu dis non c'est que t'as une idée alors...


oui

bibi182 a écrit :

aide moi sinon passe ton chemin car tu ne fais que de me remballer :/


Je t'ai déjà dit qu'un arbre ça s'explorait récursivement, et demandé pourquoi tu avais besoin de 3 classes pour construire un arbre d'entiers alors qu'une seule suffit [:spamafote]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1636167
bibi182
Posté le 03-11-2007 à 20:43:48  profilanswer
 

ben oui mais que proposes-tu comme code alors ?
j'ai appliqué ce que tu m'as dis mais ça ne convient toujours pas alors aide moi encore plus ?

n°1636170
masklinn
í dag viðrar vel til loftárása
Posté le 03-11-2007 à 20:51:03  profilanswer
 

bibi182 a écrit :

ben oui mais que proposes-tu comme code alors ?


Code :
  1. data Tree a = Node (Tree a) a (Tree a) | None
  2.              deriving Show
  3. foldTree _ None init = init
  4. foldTree f (Node left value right) init =
  5.    f (Node left value right) (foldTree f left init) (foldTree f right init)
  6. addLeft (Node None _ _) _ right = right
  7. addLeft (Node (Node _ value _) _ _) left right = value + left + right


mais je suis pas persuadé que ça t'aide beaucoup

bibi182 a écrit :

j'ai appliqué ce que tu m'as dis


non

bibi182 a écrit :

mais ça ne convient toujours pas alors aide moi encore plus ?


je suggère que tu traces ce que ton code doit faire à la main et que tu te demandes ce dont tu as besoin à chaque étape.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1636292
bibi182
Posté le 04-11-2007 à 11:03:30  profilanswer
 

Code :
  1. static int somme(Arbin<Integer> a)
  2. {
  3.     int res;
  4.     if (a.estVide())
  5.     {
  6.         res = 0;
  7.     }
  8.     else
  9.     {
  10.         res = a.ag().intValue() + a.ad().ag().intValue() + somme(a.ag()) + somme(a.ad());
  11.       // 1ère feuille gauche + 1ère feuille g. du sous-arbre droit + récursivité pour appliquer à tout l'arbre
  12.     }
  13. }


 
qu'en pensez-vous ?

n°1636321
masklinn
í dag viðrar vel til loftárása
Posté le 04-11-2007 à 12:16:56  profilanswer
 

Code :
  1. a.ag().intValue()


Bien (si #intValue() renvoie la valeur stockée dans une node de ton arbre), mais il faudrait peut-être tester si tu as un ag().

Code :
  1. a.ad().ag().intValue()


Non, ça c'est géré par les deux appels récursifs derrière, je vois pas ce que ça vient foutre ici

Code :
  1. somme(a.ag()) + somme(a.ad())


bien


Message édité par masklinn le 04-11-2007 à 12:18:59

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1636344
bibi182
Posté le 04-11-2007 à 13:27:34  profilanswer
 

Code :
  1. static int somme(Arbin<Integer> a)
  2.       {
  3.          int res;
  4.          if (a.estVide())
  5.          {
  6.              res = 0;
  7.          }
  8.          else
  9.          {
  10.      if(!a.ag().estVide())
  11.      {
  12.                  res = a.ag().intValue() + somme(a.ag()) + somme(a.ad());
  13.      }
  14.      else
  15.      {
  16.          res = 0;
  17.      }
  18.          }
  19.  return res;
  20.       }


 
#intValue() renvoie bien la valeur stockée dans un noeud de l'arbre

n°1636363
masklinn
í dag viðrar vel til loftárása
Posté le 04-11-2007 à 13:54:22  profilanswer
 

À part si tu es sûr que ton arbre est balancé, j'aurais séparé a.ag().intValue() et somme(a.ag()) + somme(a.ad()) (tu peux avoir un sous-arbre droit et pas de sous-arbre gauche).
 
Accessoirement, #estVide sert à quoi? À te dire si une node a une valeur? Ca a aussi un rapport avec les sous-arbres ou pas? Possible d'avoir son code?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1636367
bibi182
Posté le 04-11-2007 à 14:06:08  profilanswer
 

je ne vois ce que tu veux dire par

Citation :

séparé a.ag().intValue() et somme(a.ag()) + somme(a.ad())


pour #estVide(), c'est une fonction booléenne qui renvoie true si l'arbre est vide, false sinon. et elle peut s'appliquer aux sous-arbres

Message cité 1 fois
Message édité par bibi182 le 04-11-2007 à 14:08:56
n°1636379
masklinn
í dag viðrar vel til loftárása
Posté le 04-11-2007 à 14:19:27  profilanswer
 

bibi182 a écrit :

je ne vois ce que tu veux dire par

Citation :

séparé a.ag().intValue() et somme(a.ag()) + somme(a.ad())


pour #estVide(), c'est une fonction booléenne qui renvoie true si l'arbre est vide, false sinon. et elle peut s'appliquer aux sous-arbres


Code :
  1. if(!a.ag().estVide()) {
  2.    res = a.ag().intValue();
  3. }
  4. res += somme(a.ag()) + somme(a.ad());


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1636386
bibi182
Posté le 04-11-2007 à 14:28:38  profilanswer
 

Code :
  1. static int somme(Arbin<Integer> a)
  2. {
  3.               int res;
  4.               if (a.estVide())
  5.               {
  6.                   res = 0;
  7.               }
  8.               else
  9.               {
  10.                   if(!a.ag().estVide())
  11.                   {
  12.                       res = a.ag().intValue();
  13.                   }
  14.                   res = res + somme(a.ag()) + somme(a.ad());
  15.               }
  16.               return res;
  17. }


 
ça yé? dis moi que c'est bon stp...  :ouch:

n°1636390
masklinn
í dag viðrar vel til loftárása
Posté le 04-11-2007 à 14:41:02  profilanswer
 

Teste le sur divers arbres, il n'y a que comme ça que tu sauras si ça a l'air bon [:petrus75]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1636392
bibi182
Posté le 04-11-2007 à 14:44:08  profilanswer
 

ok en tant cas un grand merci à toi!! :-*

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  somme des noeuds d'un arbre

 

Sujets relatifs
Afficher un arbrefaire la somme des valeurs négatives dans une plage variable
Optimiser l'affichage d'un arbre/forumRécupération des branches d'un arbre
Somme à plusieurs critère vbasomme sous vba
XSLT et noeuds vides en sortie (C# aussi)[Excel] Mélange de somme.si et nb.si
[sql] somme d'un tableau sur les lignes[DIVERS] Excel et somme de cellule sous conditions
Plus de sujets relatifs à : somme des noeuds d'un arbre


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR