Affichage arbre binaire en C
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

Affichage arbre binaire en C



  1. #1
    invite71e1c619

    Question Affichage arbre binaire en C


    ------

    Bonsoir !
    J'ai commencé tout récemment le langage C et donc je me retrouve très souvent face à des petits ennuis.
    Je dois construire un arbre binaire et l'afficher en utilisant un parcours préfixe (donc avoir les nombres dans l'ordre croissant)
    mais je n'arrive pas à l'afficher malgré toutes les manipulations que j'ai essayé.
    N'étant pas encore très au clair avec les pointeurs je suis presque sûre que l'ennui viens de la racine utilisée pour la fonction d'affichage.

    Merci d'avance pour votre aide

     Cliquez pour afficher

    -----

  2. #2
    invite0f0afca1

    Re : Affichage arbre binaire en C

    Citation Envoyé par Lennou Voir le message
     Cliquez pour afficher
    Un seul "node" est créé dans ton arbre, et les liens left/right que tu écrases à chaque appel de "tree" ne sont pas des nodes, mais des int à valeur aléatoires. C'est un des inconvénients de la permissivité du langage C. Un compilateur plus strict aurait signalé cette erreur

  3. #3
    invite71e1c619

    Re : Affichage arbre binaire en C

    Merci déjà d'avoir répondu !

    Il faudrait donc, si j'ai bien compris, créer à chaque fois un nouveau noeud mais je ne vois pas comment le rattacher au précédent.
    je serai tentée de mettre par exemple
    Code:
    n->right = create_node(v);
    je passe du langage Pascal et j'ai donc sûrement des idées pas compatibles avec le C =/

  4. #4
    invite0f0afca1

    Re : Affichage arbre binaire en C

    Glurp, j'ai répondu trop vite...

    Ce qui n'est pas bon ce sont bien les 2 appels "tree(n->right, v)" et "tree(v->left, v)", mais le problème est différent:

    Il faut tester la nullité du pointeur et l'initialiser au besoin "n->left = tree(NULL, v)", respectivement "n->right = tree(NULL, v)". Sinon left et right ne sont jamais initialisés

    Il faut revoir aussi "main" pour correctement initialiser l'arbre. En passant toujours "root" en argument, ça ne peut pas marcher.

  5. A voir en vidéo sur Futura
  6. #5
    invite0f0afca1

    Re : Affichage arbre binaire en C

    Je suis un peu rouillé en C..... Voilà une fonction treesinsert qui n'utilise pas la récursivité, qui prend root comme argument d'entrée (à initialiser séparemment), et qui insère la valeur à la bonne place dans l'arbre. J'ai pas testé, mais c'est l'idée

    Code:
    Node* treeInsert(Node* node, int v)
    {
     Node* p;
    
     do
     {
      p = node;
      if (v < p->v)
      {
       node = node->left;
      }
      else
      {
       node = node->right;
      }
     } while (node != null);
    
     node = create_node(v);
     
     if (v < p->v)
     {
      p->left = node;
     }
     else
     {
      p->right = node;
     }
    
     return node;
    }

  7. #6
    invite7a96054d

    Re : Affichage arbre binaire en C

    Bonsoir,

    Le problème vient de ta fonction tree. Comme tu l'as construite tu dois toujours utiliser sa valeur de retour car les paramètres ne sont pas modifiés, en autre quand tu crées un fils :

    Code:
    Node* tree(Node* n, int v)
    {
        if (n == NULL)
        {
           n = create_node(v);
    
        }
        else
        {
            if (n->value < v)
            {
                n->right = tree(n->right, v);
            }
            else
            {
                n->left = tree(n->left, v);
            }
        }
    
        return n;
    }
    Ensuite si tu désires effectuer un parcours préfixe d'un arbre binaire, tu commences par afficher le nœud courant puis tu affiches le fils gauche, puis le droit :

    Code:
    void print_tree( Node* n )
    {
        if (n != NULL)
        {
            printf("%d", n->value);
            if (n->left != NULL)
                print_tree(n->left);
            /* printf("%d", n->value); */
            if (n->right != NULL)
                print_tree(n->right);
            /* printf("%d", n->value); */
        }
    }
    Mais cela ne va te donner les nombres par ordre croissant, pour faire cela il faut d'abord afficher ce qui est plus petit, puis le nœud courant puis ce qui est plus grand : un parcours infixe. Je te laisse écrire le code correspondant

    Pour un premier jet c'est pas mal
    Il faudra néanmoins penser (ce sont de bonnes pratiques) à :

    * tester la valeur de retour du malloc pour gérer les erreurs d'allocations (important)
    * ne pas caster le retour du malloc (les avis divergent).
    * ajouter des espaces quand tu affiches ton arbre (plus lisible)

  8. #7
    invite71e1c619

    Re : Affichage arbre binaire en C

    Merci à tous !

    J'ai essayé de regrouper vos conseils et le tout marche enfin

    Voila mon code si jamais

     Cliquez pour afficher

  9. #8
    invite7a96054d

    Re : Affichage arbre binaire en C


    Juste en passant, dans le morceau :
    Code:
    Node* tree(Node* n, int v)
    {
        if (n == NULL)
        {
           n = create_node(v);
    
        }
        else
        {
            if (n->value < v)
            {
                if (n->right == NULL)
                {
                    n->right = create_node(v);
                }
                else
                {
                    tree(n->right,v);
                }
            }
            else
            {
                if (n->left == NULL)
                {
                    n->left = create_node(v);
                }
                else
                {
                    tree(n->left,v);
                }
            }
        }
        return n;
    }
    Il est inutile de vérifier si le fils gauche ou le fils droit est NULL, car si c'est le cas un appel récusif fait le boulot, ici tu dupliques du code inutilement.
    La version courte est simplement celle que j'ai postée un peu plus haut :
    Code:
    Node* tree(Node* n, int v)
    {
        if (n == NULL)
           n = create_node(v);
        else if (n->value < v)
           n->right = tree(n->right,v);
        else
           n->left = tree(n->left,v);
        return n;
    }
    C'est plus compact, et avec l'habitude c'est «récursivement» plus parlant (ne traiter les cas particuliers que lorsqu'ils sont particuliers )

    En tout cas un beau début avec les arbres binaires de recherche.

Discussions similaires

  1. [Caml] Vérifier qu'un arbre binaire est un ABR
    Par invite476719f2 dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 06/11/2011, 17h18
  2. calcul de chemin interne dans un arbre binaire
    Par inviteb21cd820 dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 29/12/2010, 15h01
  3. [En cours] Montre à affichage binaire (LEDVETIA)
    Par invite7d75e3ac dans le forum Électronique
    Réponses: 33
    Dernier message: 08/01/2010, 10h36
  4. Passage de Binaire Naturel à Binaire reflechis. [1STI]
    Par invite5e1b98cd dans le forum Électronique
    Réponses: 7
    Dernier message: 12/11/2009, 20h34
  5. Horloge affichage binaire
    Par invite5ef698cd dans le forum Électronique
    Réponses: 20
    Dernier message: 06/08/2006, 18h12