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

Langage C++ Discussion :

Recherche dans un arbre binaire non trié


Sujet :

Langage C++

  1. #1
    Membre émérite Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Par défaut Recherche dans un arbre binaire non trié
    Bonjour.
    Je pars d'un arbre binaire non trié (ce n'est pas un abr). Chaque nœud contient une valeur entière et les adresses de ses fils gauche et droit.
    Je cherche à trouver l'adresse du nœud contenant une valeur donnée. J'ai codé une fct récursive censé renvoyer cette adresse.

    La fct trouve bien la bonne adresse mais ne renvoie pas celle-ci :

    20 ( 9 ( 15 ( 1 , 8 ) , 3 ( 4 , 6 ) ) , 16 ( 14 ( 12 , 7 ) , )
    valeur testée : 20
    valeur testée : 9
    valeur testée : 15
    valeur testée : 1
    valeur testée : 8
    valeur testée : 3
    valeur testée : 4
    Trouvé valeur 4 en 0x18caef0
    valeur testée : 6
    valeur testée : 16
    valeur testée : 14
    valeur testée : 12
    valeur testée : 7
    Le pb vient probablement de la façon de sortir de la récursive mais je sèche ...

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    #include <iostream>
    using namespace std;
     
    typedef struct noeud noeud;
    struct noeud {
    	int valeur;
    	noeud *fils_gauche;
    	noeud *fils_droite;
    };
    using arbreBinaire = noeud *;
     
    void affiche(arbreBinaire);
    noeud* getPtrNoeud(int, arbreBinaire);
    int main() {
    	noeud *n1 = new noeud { 1, nullptr, nullptr };
    	noeud *n2 = new noeud { 8, nullptr, nullptr };
    	noeud *n3 = new noeud { 4, nullptr, nullptr };
    	noeud *n4 = new noeud { 6, nullptr, nullptr };
    	noeud *n5 = new noeud { 12, nullptr, nullptr };
    	noeud *n6 = new noeud { 7, nullptr, nullptr };
    	noeud *n7 = new noeud { 15, n1, n2 };
    	noeud *n8 = new noeud { 3, n3, n4 };
    	noeud *n9 = new noeud { 14, n5, n6 };
     
    	noeud *n10 = new noeud { 9, n7, n8 };
    	noeud *n11 = new noeud { 16, n9, nullptr };
    	noeud *n12 = new noeud { 20, n10, n11 };
    	arbreBinaire ab = n12;
    	affiche(ab);
    	cout << endl;
    	noeud *n = new noeud;
    	n = getPtrNoeud(4, ab);
    	cout << "Résultat : " << n->valeur << endl;
    	return 0;
    }
     
    void affiche(arbreBinaire ab) {
    	if (ab != nullptr) {
    		cout << ab->valeur << " ";
    		if (ab->fils_gauche != nullptr) {
    			cout << " ( ";
    			affiche(ab->fils_gauche);
    		}
    		if (ab->fils_gauche != nullptr || ab->fils_droite != nullptr) {
    			cout << ", ";
    		}
    		if (ab->fils_droite != nullptr) {
    			affiche(ab->fils_droite);
    			cout << " ) ";
    		}
    	}
    }
     
    noeud* getPtrNoeud(int v, arbreBinaire ab) {
    	cout << "valeur testée : " << ab->valeur << endl;
    	if (ab->valeur == v) {
    		cout << "Trouvé valeur " << ab->valeur << " en " << ab << endl;
    		return ab;
    	}
    	if (ab->fils_gauche != nullptr) {
    		getPtrNoeud(v, ab->fils_gauche);
    	}
    	if (ab->fils_droite != nullptr) {
    		getPtrNoeud(v, ab->fils_droite);
    	}
    }

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 145
    Billets dans le blog
    4
    Par défaut
    Dommage, t'étais vraiment pas loin
    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
    noeud* getPtrNoeud(int v, arbreBinaire ab) {
    	cout << "valeur testée : " << ab->valeur << endl;
    	if (ab->valeur == v) {
    		cout << "Trouvé valeur " << ab->valeur << " en " << ab << endl;
    		return ab;
    	}
    	if (ab->fils_gauche != nullptr) {
    		if (noeud* left = getPtrNoeud(v, ab->fils_gauche))
    			return noeud;
    	}
    	if (ab->fils_droite != nullptr) {
    		if (noeud* right = getPtrNoeud(v, ab->fils_droite))
    			return right;
    	}
    	return nullptr;
    }
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre émérite Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Par défaut

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 466
    Par défaut
    Je n'ai jamais vu autant de new dans un code C++.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JTree]recherche dans un arbre (non binaire ?)
    Par biozaxx dans le forum Composants
    Réponses: 3
    Dernier message: 07/05/2013, 13h32
  2. Algorithme de suppression d'un élément dans un arbre binaire de recherche
    Par mohsenuss91 dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 24/12/2011, 12h05
  3. Réponses: 2
    Dernier message: 07/12/2009, 11h43
  4. Ajout dans les arbres binaires de recherche
    Par chouki dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 28/12/2008, 15h32
  5. Suppression dans un arbre binaire de recherche
    Par zeine77 dans le forum Langage
    Réponses: 1
    Dernier message: 11/05/2007, 20h40

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