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

C Discussion :

Parcourir un arbre n-aire


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Technicien, en informatique
    Inscrit en
    Décembre 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien, en informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 17
    Par défaut Parcourir un arbre n-aire
    Bonjour,
    je début dans les arbres n-aire mais je n'arrive pas a trouver la solution pour afficher mon arbre, voici mon code :


    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
    typedef struct arbre Arbre;      
    struct arbre      
    {      
        int val;      
        Arbre *frere;      
        Arbre *enfant;      
    };      
     
    typedef struct pile Pile;      
    struct pile      
    {      
     Arbre *monArbre;      
     Pile *suivant;      
    };      
     
    void afficheArbre2(Arbre t, Pile p){      
     Pile *tempPile=&p;      
     printf("\nValeur de l'arbre: %i",t.val);      
     //si je suis un noeud on le place dans la pile      
     if((t.frere!=NULL)&&(t.enfant!=NULL)){      
      if(p.monArbre==NULL){      
       p.monArbre=&t;      
      }else{      
       while(tempPile->suivant!=NULL){      
        tempPile=tempPile->suivant;      
       }      
       tempPile->monArbre=&t;      
      }      
     }         
     if(t.frere!=NULL){      
      afficheArbre2(*t.frere,p);      
     }else if(t.enfant!=NULL){      
      afficheArbre2(*t.enfant,p);      
     }      
    }   
     
    int main(void){
        Arbre I = {9, NULL, NULL};
        Arbre H = {8, &I, NULL};
        Arbre G = {7, &H, NULL};
        Arbre F = {6, NULL, &G};
        Arbre E = {5, NULL, NULL};
        Arbre D = {4, &E, NULL};
        Arbre C = {3, NULL, &F};
        Arbre B = {2, &C, &D};
        Arbre A = {1, NULL, &B};
     
        Pile p = {NULL,NULL};
        afficheArbre2(A,p);
        return 0;
    }

    et comme résultat j'ai 1 2 3 6 7 8 9
    je sais qu'il faut faire du backtracking mais je n'y arrive pas voila.
    Merci pour votre aide.

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(t.frere!=NULL){      
      afficheArbre2(*t.frere,p);      
     }else if(t.enfant!=NULL){      
      afficheArbre2(*t.enfant,p);      
     }
    Pourquoi le else ?

    A quoi sert la pile dans ton code ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void afficheArbre2(Arbre const *t)
    {
     printf("\nValeur de l'arbre: %i",t->val);
     if(t->frere!=NULL)  afficheArbre2(t->frere);
     if(t->enfant!=NULL)  afficheArbre2(t->enfant);
    }
    ....
    afficheArbre2(&A);

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par défaut
    salut,

    Je pense que tu peux faire un truc du genre (non testé):
    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
     
    typedef struct _TREE_NODE{
    	char * name;
    	struct _TREE_NODE * firstChild;
    	struct _TREE_NODE *  nextSibling;
    } TREE_NODE;
     
    void printNode(TREE_NODE * node){
     
    	if(node == NULL){
    		return;
    	}
     
    	if(node->name != NULL){
    		printf("node name : %s\n", node->name); 
    	} else {
    		printf("node name : no name\n");
    	}
     
    	if(node->firstChild != NULL){
    		printNode(node->firstChild);
    	}
     
    	if(node->nextSibling != NULL){
    		printNode(node->nextSibling);
    	}
    }
     
     
    TREE_NODE * root = ... ; // noeud racine
     
    void main(void){
     
    	printNode(root);
     
    }

Discussions similaires

  1. Parcourir un arbre + ecriture fichier
    Par arnapou dans le forum C
    Réponses: 16
    Dernier message: 03/03/2006, 10h02
  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