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 :

Arbre binaire -> liste chainé


Sujet :

C++

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 40
    Points : 17
    Points
    17
    Par défaut Arbre binaire -> liste chainé
    Bonsoir, je bloque sur un exo alors je dois renvoyer la liste des valeurs des noeuds de l'arbre binaire A qui sont à profondeur p , il s'agit de lafonction liValprof (j'ai utiliser la fonction creerLSC qui crée une liste chainé et la fonction concatLSC qui concatène deux listes ) si quelqu'un pourrait m'aider s'il vous plait merci d'avance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ListeSC creerLSC(int val, ListeSC succ){
      ListeSC l = new CelluleSC;
      l->info=val;
      l->succ=succ;
      return l;}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ListeSC concatLSC(ListeSC L1, ListeSC L2){
      ListeSC P;
      if (L1==NULL) return L2;
      else {
        P= L1;
        while (P->succ != NULL) P=P->succ;
        P->succ = L2;
        return L1;}}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ListeSC liValprof(ArbreBin A,int p){
    p=2;
    if(A==NULL){
            return NULL;}
     
            if(p==0){
                return concatLSC(creerLSC(A->info,liValprof(A->sag,p)),liValprof(A->sad,p));}
            else{
            return concatLSC(liValprof(A->sag,p-1),liValprof(A->sad,p-1));}
    }

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Dis-nous déjà si tu dois prendre tous les nœuds de profondeur P, ou bien tous les nœuds de profondeur égale ou supérieure à P ?

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 40
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par foetus Voir le message
    Dis-nous déjà si tu dois prendre tous les nœuds de profondeur P, ou bien tous les nœuds de profondeur égal ou supérieur à P ?
    Tous les noeud de profondeur 2 comme ceci : Nom : Capture d’écran 2019-12-30 à 23.11.46.png
Affichages : 601
Taille : 83,0 Ko

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Ta fonction liValprof() reçoit un paramètre au nom très significatif de p, ce paramètre est important pour compter les niveaux.
    Dès la première ligne de la fonction, tu perds immédiatement cette valeur pour la remplacer par un 2. C'est mal parti pour s'en servir!

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Effectivement je n'avais pas vu la ligne p=2 reportée par @dalfab

    Mais si je te pose cette question, c'est pour une raison très simple : "Si tu veux seulement les nœuds de profondeur P, alors pourquoi n'arrêtes tu pas ton parcours à la profondeur P et tu relances ton parcours ?
    Je te redis ce que je t'ai dit sur un autre fil de discussion : "tu réfléchis mal"

    Donc ta ligne return concatLSC( creerLSC(A->info, liValprof(A->sag, p)), liValprof(A->sad, p) ); serait plus du genre return concatLSC( creerLSC(A->info, NULL) );.

    D'ailleurs, en C++ tu as les valeurs par défaut ListeSC creerLSC(int val, ListeSC succ=NULL) : ceci évitera de reprendre tout ton code en cas de changement de valeur terminale (même s'il n'y a peu de chance)

    En réalité ce qui me dérange dans ton code c'est 1) c'est du C et non pas du C++ et 2) c'est une implémentation de liste chaînée bancale.
    1. En C++, tu devrais faire une classe liste ou tree, et ne pas avoir de fonctions libres, mais des méthodes. Je sais très bien que la surcharge de l'opérateur + pour la concaténation c'est peut-être trop tôt pour ton niveau, mais regarde ton code : des pointeurs partout. C'est du C, du C scolaire.
    2. Ton implémentation C de ta liste chaînée est bizarre On ne devrait jamais créer un nouveau nœud, mais ajouter une valeur à une liste. D'ailleurs tu ajoutes en tête et tu concatènes à la fin (*) : tu sembles n'avoir aucune vision de ce que tu veux faire. En algorithmie, ce n'est pas pour rien qu'il existe des structures file ("queue" en anglais), pile ("stack" en anglais), liste circulaire, tous les arbres (AVL, red-black, binaire, binaire de recherche, ...) ... Tu me diras qu'il existe aussi la liste chaînée c'est vrai mais pour moi c'est plus un moyen d'implémentation au même titre qu'un tableau contiguë.


    * : c'est vrai que c'est une concaténation "chaîne de caractères". Mais si tu ajoutes au début, pourquoi n'ajoutes-tu pas tous les nœuds de liste2 1 par 1, à liste1 ?

Discussions similaires

  1. Liste chainée, Arbre binaire
    Par Mercenaire dans le forum Débuter avec Java
    Réponses: 8
    Dernier message: 05/12/2011, 17h18
  2. liste chainée et arbre binaire
    Par ZashOne dans le forum C
    Réponses: 7
    Dernier message: 07/04/2009, 18h46
  3. probleme arbre binaire de chaine
    Par nevroo dans le forum C
    Réponses: 9
    Dernier message: 31/10/2006, 21h53
  4. Réponses: 3
    Dernier message: 19/10/2006, 15h04
  5. Probleme arbre/liste chainée en template
    Par Raton dans le forum Langage
    Réponses: 1
    Dernier message: 07/11/2005, 16h09

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