Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C] AIUTO ALBERO BINARIO

    Ciao a tutti
    volevo chiedervi se gentilmente potreste risolvere un mio quesito:

    avendo caricato in un albero binario delle struct, corrispondenti a dei prodotti e fatte in questo modo:

    struct prodotto{
    char codice[6]; //codice prodotto
    int quantita; //quantità disponibile
    int venduti; //pezzi venduti
    struct prodotto *left;
    struct prodotto *right;
    }

    come faccio a ricercare nell'albero quel prodotto che è stato maggiormente venduto (ovvero quello che ha il valore maggiore del campo venduti)

    Potreste indicarmi una semplice funzione in c che effettui la visita dell'albero e mi restituisca il nodo cercato o alternativamente stampi a video il codice del prodotto più venduto?

    Vi ringrazio,

    Draganbao

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    117
    1) L'albero è ordinato? Se si, secondo che criterio?
    2) Ma ci hai provato a farla questa funzione?

  3. #3
    Si certo...l'albero è ordinato rispetto alla chiave che è: codice

    Certo che ho provato a fare la funzione e alla fine l'ho fatta in questo modo...

    void trovaArticoloPiuVenduto(struct prodotto *radice){
    if(radice != NULL){
    trovaArticoloPiuVenduto(radice->left);
    if(radice->venduti > maxVenduti){
    maxVenduti = radice->venduti;
    prodottoPiuVenduto = radice;
    }
    trovaArticoloPiuVenduto(radice->right);
    }
    }


    ho fatto una visita dell'albero e se il nodo visitato ha campo venduti > di maxVenduti salvo il nodo nella variabile globale prodottoPiuVenduto di tipo struct prodotto *.
    In questo modo però sia la variabile maxVenduti sia la variabile prodottoPiuVenduto sono globali. Mi chiedevo se c'era un modo per effettuare il confronto..e solo al termine della visita di tutto l'albero restituire il nodo con campo venduti più grande.
    Cerco di spiegarmi meglio: poniamo che 3 nodi vengano visitati, nel primo il campo venduti sia = a 1, nel secondo 2 e nel terzo 3. In tutti e tre i casi, il confronto avrà esito positivo e la variabile prodottoPiuVenduto punterà prima al nodo1, poi al nodo2 e infine al nodo3. Alla fine la variabile prodottoPiuVenduto punterà giustamente al nodo3, ma mi sembrano un po' inutili i due assegnamenti precedenti.
    Non so se sono stato molto chiaro..ma spero mi abbiate capito.

    Draganbao

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    117
    vabbè... ma dato che l'albero non è ordinato rispetto ai pezzi venduti devi per forza visitarlo tutto per essere sicuro di trovare il massimo.

    Quindi l'unico modo per trovarlo è proprio questo, un massimo provvisorio che aggiorni man mano, ci sta poco da fare. Volendo puoi evitare le variabili globali, ma per il problema degli assegnamenti non si può far niente.

  5. #5
    Mi faresti vedere come modifichi la funzione mettendo le variabili locali invece che globali... io non riesco.
    Ti ringrazio

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    117
    codice:
    struct prodotto *trovamax(struct prodotto *radice)
    {
      if (radice == NULL)
        return NULL;
      else
      {
        struct prodotto *max = radice;
        struct prodotto *maxl = trovamax(radice->left);
        struct prodotto *maxr = trovamax(radice->right);
        if (maxr != NULL)
          if (max->venduti < maxr->venduti)
            max = maxr;
        if (maxl != NULL)
          if (max->venduti < maxl->venduti)
            max = maxl;
        return max;
      }
    }
    Non l'ho provata, ma dovrebbe funzionare, fammi sapere...

  7. #7
    Si, funziona benissimo, grazie mille.

    Praticamente scendi prima nel sottoalbero sinistro, e poi in quello destro...e risalendo effettui i confronti e se il confronto ha esito positivo ritorni il max?

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    117
    imposto come massimo provvisorio la radice, poi trovo il massimo del sottoalbero sinistro, il massimo del sottoalbero destro.

    Se esistono (non sono NULL) e sono maggiori del massimo provvisorio, allora lo aggiorno e alla fine lo ritorno...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.