IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

remplissage d'un arbre n-aire


Sujet :

JavaScript

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 206
    Points : 81
    Points
    81
    Par défaut remplissage d'un arbre n-aire
    Bonjour à tous,

    Voilà j'ai un problème métaphysique, qui touche aux hauteurs algorithmique.
    Depuis une base de données via php, je génère un menu cf fichier joint.
    Ce menu est une liste (ul,li) modifier avec feuille de style et javascript qui vont bien pour lui donner cette allure et de l'interactivité.

    Bien, maintenant, je souhaiterais régenerer mon arbre n-aire à partir du tableau de noeud ci dessous (constuit en php):

    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
     
    // tableau contenant les noeuds
    var aNode=new Array();	    	
     
    // mon premier noeud
    var aFils=new Array(591,2,3,4,5);
    var oNode=new classNode('',0,aFils);
    // ajout du noeud dans le tableau
    aNode[aNode.length]=oNode;	    
     
    var aFils=new Array(16,1,586);
    var oNode=new classNode('0',591,aFils);
    // ajout du noeud dans le tableau
    aNode[aNode.length]=oNode;	    	
     
    var aFils=new Array(164,165);
    var oNode=new classNode('591',16,aFils);
    // ajout du noeud dans le tableau
    aNode[aNode.length]=oNode;
     
    Ainsi de suite : la taille du tableau est de 650, donc je ne mets pas tout
    Ma class utilisée ci dessus et que je vais réutiliser pour construire mon arbre est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     // class qui permet de construire l'arbre   	
    function classNode(codePere,codeProgramme,aFils)
    {
    	this.codePere=codePere;
    	this.codeProgramme=codeProgramme;
    	this.aFils=aFils;
     
    	this.addFils = function addFils(oFils)
    	{
    		this.aFils[aFils.length]=oFils;
    	}
    }
    Et ma fonction récursive pour reparcourir l'arbre et le reconstruire :
    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
     
    // construction de l'arbre de facon recursive
    // quand on arrive dans cette fonction, le noeud est presque remplit, il manque plus que les fils
    function genereTree(oPere)
    {    		
    	// on recherche l'element du tableau qui a le meme code que le noeud pere pour ajouter les fils
    	for(indNode=0;indNode<aNode.length;indNode++)
    	{
    		if(aNode[indNode].codeProgramme==oPere.codeProgramme)
    		{				
    			// parcours tous les fils
    			iNbFils=aNode[indNode].aFils.length;
    			element=aNode[indNode];
    			for(indChild=0; indChild<iNbFils ;indChild++)
    			{
    				// construit le noeud fils oNode
    				alert(element.aFils[indChild]);
    				oNode=new classNode(oPere.codeProgramme,element.aFils[indChild],new Array()); 
    				// ajoute le fils oNode au pere oPere
    				oPere.addFils(oNode);
    				// appel recursif pour ajouter le fils du fils oNode
    				genereTree(oNode);
    			}
    		}
    	}
    }
     
    // construction de la racine
    var tree=new classNode('',aNode[0].codeProgramme,new Array());
    genereTree(tree); // on commence par le noeud 0 (la racine)
    Le résultat : la fonction genereTree fait UN parcours en profondeur!!!
    En d'autres termes : il me fait une seule branche avec au bout ses petites feuilles, mais il ne veut pas continuer sa construction.

    Où me trompe je???

    Déjà, merci aux personnes qui ont bien voulu prendre la peine de lire jusqu'ici.
    Ensuite, les personnes qui essayerons de me proposer des solutions auront toute mon estime et ma gratitude et ma reconnaissance.

    Sur ce bonne journée
    Images attachées Images attachées  

  2. #2
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Bonjour,
    je pense que c'est le "this" dans la fonction qui merdoie.
    Passe plutôt l'ID en param, et dans ta fonction tu remplaces le this par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.getElementById('id_en_param')
    A+

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 206
    Points : 81
    Points
    81
    Par défaut pa glop
    Bonsoir E.Bzz,

    Tu es allé un peu vite, "le this de la fonction", lequel je dois enlever?
    this.addFils ou this.aFils[aFils.length] ?

    Et je passe l'identifiant de quoi comment?
    document.getElementById('id_en_param')???

    Peux tu préciser un peu plus? Merci.
    Je tenterai cette solution demain. Mais je ne suis pas très optimiste

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Citation Envoyé par crazykangourou
    Tu es allé un peu vite, "le this de la fonction", lequel je dois enlever?
    Tous (pas enlever : remplacer) !
    Et je passe l'identifiant de quoi comment?
    document.getElementById('id_en_param')???
    "this" représente l'élément courrant. Dans ta fonction, il est censé représenter l'élément qui a déclenché l'évènement (et donc l'appel de la fonction) :
    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
     ...
    // class qui permet de construire l'arbre   	
    function classNode(idParam, codePere,codeProgramme,aFils)
    {
    	document.getElementById(idParam).codePere=codePere;
    	document.getElementById(idParam).codeProgramme=codeProgramme;
    	document.getElementById(idParam).aFils=aFils;
     
    	document.getElementById(idParam).addFils = function addFils(oFils)
    	{
    		document.getElementById(idParam).aFils[aFils.length]=oFils;
    	}
    }
    </script>
    </head>
    <body>
    ...
    <input type="button" id="bt_test" value="TEST" onclick="classNode(this.id, ...,...,...)">
    Y a sûrement mieux, j'ai fait au plus simple.
    A adapter évidemment ...

    A+

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 206
    Points : 81
    Points
    81
    Par défaut
    Bon,
    Là je suis au boulot, et je ne sais pas si on est sur la même longueur d'onde, mais la solution proposée me parait plus que bizzard.

    Comment j'appelle ma fonction récursive genereTree?

    Je repose ma question :
    Pourquoi je ne peux pas parcourir la totalité de l'arbre?
    Autrement dit je ne peux parcourir qu'une branche et toutes ses feuilles, mais je ne peux pas faire toutes mes branches et donc mes sous arbres

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 206
    Points : 81
    Points
    81
    Par défaut question ouverte
    Voilà

    Je fais appelle à votre expertise :

    J'ai un menu avec des cases a cocher, comment faire pour cocher et décocher en cascades les cases filles de la case que je viens de cocher?

Discussions similaires

  1. remplissage d'un arbre n-aire
    Par crazykangourou dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 22/05/2007, 09h31
  2. Parcours en profondeur d'un arbre n-aire
    Par Premium dans le forum Langage
    Réponses: 11
    Dernier message: 20/02/2006, 08h01
  3. [debutant] parcours en profondeur arbre n-aire
    Par tx dans le forum Langage
    Réponses: 1
    Dernier message: 15/02/2006, 03h56
  4. construire un arbre n-aire
    Par emidelphi77 dans le forum Langage
    Réponses: 2
    Dernier message: 11/10/2005, 18h47
  5. arbre n-aire delete
    Par Fry dans le forum C++
    Réponses: 13
    Dernier message: 19/10/2004, 21h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo