Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [C++] Cammino Albero

  1. #1

    [C++] Cammino Albero

    la seguente funzione dovrebbe stabilire se esiste un cammino che ci permette di totalizzare un determinato punteggio... solo che non mi va...

    la chiamata è la seguente:
    codice:
    bool esiste = esiste_cammino(tree,0,15);
    mentre la funzione:

    codice:
    bool esiste_cammino(nodo *t,int tot,int punteggio){
    	if (t == NULL){
    		return false;
    	}
    	if (foglia(t) && tot==punteggio) return true;
    		else return false;
    	bool l = esiste_cammino(t->left,tot+t->info,punteggio);
    	bool r = esiste_cammino(t->right,tot+t->info,punteggio);
    	if ((l == true) || (r == true))
    		return true;
    	return false;
    	
    	}
    grazie

  2. #2
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    L'errore sta nel fatto che chiami ricorsivamente la funzioen sui figli senza aver prima verificato se i figli esistono, causando un errore di memoria. Precisaemnte l'errore si ha nel caso in cui un nodo ha un solo figlio, in questo caso non è una foglia e quindi il secondo if non è eseguito e si passa alle chiamate ricorsive sui figli.

    Una versione corretta è:

    codice:
    bool esiste_cammino(nodo *t,int tot,int punteggio){
    	if (t == NULL){
    		return false;
    	}
    	if (foglia(t) && tot==punteggio) return true;
    		else return false;
    	bool l = false, r = false;
            if(t->left)
                  l = esiste_cammino(t->left,tot+t->info,punteggio);
    	if(t->right)
                   r = esiste_cammino(t->right,tot+t->info,punteggio);
    	return l || r;
    }

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  3. #3
    Grazie! ora funziona... avevo fatto anche un altro errore... tornavo false se tot era diverso dal punteggio senza controllare negli altri rami... grazie ancora ciao!
    codice:
    bool esiste_cammino(nodo *t,int tot,int punteggio){
    	if (t == NULL){
    		return false;
    	}
    	if (foglia(t) && tot==punteggio) return true;
    
    	if (t->left!=NULL)
    	return esiste_cammino(t->left,tot+t->info,punteggio);
    	if (t->right !=NULL)
    	return esiste_cammino(t->right,tot+t->info,punteggio);
    
    
    
    	
    	}


  4. #4
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    guarda che l'ultima versione che hai scritto no e corretta perche potrebbe non controllare il cammino sul figlio destro....

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  5. #5


    ok penso di aver capito anche il xchè... grazie...


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.