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 de recherche équilibré


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Points : 9
    Points
    9
    Par défaut Arbre binaire de recherche équilibré
    Bonjour

    Le critere d’ ́equilibre est la taille des sous-arbres : un arbre est equilibre si, pour tout noeud de l’arbre, la taille de son fils gauche est egale a la taille de son fils droit a` un noeud pr`es (la taille d’un arbre est son nombre de noeuds, feuilles comprises).

    Ecrire en C la fonction ConstruitArbreEquilibre(int T[], int g, int d) qui construit et renvoie un arbre binaire de recherche equilibre contenant les valeurs T[g], T[g+1],..., T[d]. On suppose que les valeurs dans le tableau T sont definies pour les indices compris entre g et d, et sont ordonnees dans l’ordre croissant.

    Bref j'ai pensé a faire une dichotomie sur le tableau a chaque fois ajouté l'élement médian, mais j'arrive pas à l'implémenter avec ce protoype.
    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
    typedef struct noeud* ARBRE;
     
    typedef struct noeud
    {
        int val;
        struct noeud* fg;
        struct noeud* fd;
    } NOEUD;
     
    ARBRE cree_Noeud(int val, ARBRE fg, ARBRE fd)
    {
        ARBRE arbre = malloc(sizeof(struct noeud));
        arbre->val = val;
        arbre->fg = fg;
        arbre->fd = fd;
        return arbre;
    }
     
    ARBRE inserer(int val,ARBRE a)
    {
        if(a == NULL)
                return cree_Noeud(val,NULL,NULL);
        if(val < a->val)
                a->fg=inserer(val,a->fg);
        else if(val > a->val) 
        			a->fd = inserer(val,a->fd);
        return a;
    }
    ConstruitArbreEquilibre(int T[], int g, int d)
    {
     
    }
    J'ai vraiment du mal :/ si vous pouvez m'aider.Bonne année =)

  2. #2
    Membre chevronné
    Avatar de emixam16
    Homme Profil pro
    Chercheur en sécurité
    Inscrit en
    Juin 2013
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Chercheur en sécurité

    Informations forums :
    Inscription : Juin 2013
    Messages : 333
    Points : 1 828
    Points
    1 828
    Par défaut
    Ce forum est la pour aider le gens quand ils ont une difficulté. Mais pour qu'on t'aide, il faut que tu montre que tu as au moins essayé, que tu as des pistes des idées.

    La tu balance brut une consigne, et voici l'étendue de ton travail de recherche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ConstruitArbreEquilibre(int T[], int g, int d)
    {
     
    }
    Voici quand même un lien qui pourra t'aider.

    La prochaine fois reviens avec du code.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Merci de votre réponse, ma méthode aurait été d'implémenter tous les médians en premier de chaque intervalles. Mais c'est assez dure je pensais à une solution astucieuse récursive que je n'arrive pas à voir avec ce prototype.

  4. #4
    Membre chevronné
    Avatar de emixam16
    Homme Profil pro
    Chercheur en sécurité
    Inscrit en
    Juin 2013
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Chercheur en sécurité

    Informations forums :
    Inscription : Juin 2013
    Messages : 333
    Points : 1 828
    Points
    1 828
    Par défaut
    Si la solution n'est pas évidente à tes yeux (et ce sera souvent le cas) prends une feuille, un crayon, et esssaye de poser le problème en français, par étape.

    Dans ton algo tu dois insérer les éléments 1 par 1.

    Pour chaque insertion tu as deux possibilités.
    • Soit une insertion classique ne déséquilibre pas l'arbre donc tu peux insérer le nœud directement.
    • Soit une insertion classique déséquilibrerait l'arbre donc tu dois rééquilibrer l'arbre (cf lien plus haut) avant toute insertion.

    Il te reste deux problèmes a résoudre. Quand est-ce qu'un arbre est équilibré? Comment rééquilibrer un arbre déséquilibré.

    Essaye de poster du code.

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En fait, tu as deux solutions:
    1. Implémenter un véritable arbre auto-équilibré, comme par exemple un arbre AVL. Auquel cas, tu peux simplement y ajouter les éléments dans l'ordre, et l'arbre fera le reste.
    2. Ton idée originelle, un arbre qui ne s'équilibre pas mais où l'on insère les éléments triés récursivement de manière à le construire équilibré.

    La seconde méthode étant la plus simple (même si la première est la plus pérenne).

    Ta fonction, qui prend en paramètre un tableau trié et deux bornes (que je suppose inclusives), doit donc:
    • Si le tableau fait juste zéro cases (donc, si borne inférieure est supérieure à borne supérieure), ne rien faire.
    • Si le tableau fait juste une case (donc, si les bornes sont égales), juste l'ajouter à l'arbre.
    • Sinon:
    • Calculer l'index au milieu des deux bornes (en gros, la moyenne des bornes).
    • Ajouter à l'arbre la valeur se trouvant à cet index.
    • Rappeler récursivement la fonction sur [borne inférieure, milieu[ (donc, [borne inférieure, milieu-1])
    • Rappeler récursivement la fonction sur ]milieu, borne supérieure] (donc, [milieu+1, borne supérieure])

    Le prototype de la fonction récursive doit donc être:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void ajouterValeursTriees(struct arbre *pArbre, int const *tabTrie, int g, int d)
    { }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ARBRE ConstruitArbreEquilibre(int t[], int g, int d)
    {
         if (g>d)
             return(NULL)
         else {
             return(creeNoeud(t[(d-g)/2], ConstruitArbreEquilibre(t, g, 
    (d-g)/2-1), ConstruitArbreEquilibre(t, (d-g)/2+1, d)));
         }
    }

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ce n'est pas (d-g)/2 qu'il te faut, mais la moyenne des deux (donc, plutôt (d+g)/2 si d et g sont suffisamment petits; sinon il faut un truc du genre g + (d-g)/2)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Arbres binaire de recherche équilibré
    Par Sebou dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 16/05/2008, 17h52
  2. Suppression dans un arbre binaire de recherche
    Par zeine77 dans le forum Langage
    Réponses: 1
    Dernier message: 11/05/2007, 20h40
  3. Réponses: 3
    Dernier message: 31/12/2005, 12h30
  4. Réponses: 11
    Dernier message: 07/04/2004, 13h06
  5. [Arbre binaire de Recherche]
    Par Giovanny Temgoua dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 06/02/2004, 11h45

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