Cancella foglie albero

di il
3 risposte

Cancella foglie albero

Ciao raga, l'esercizio che voglio fare è rimuovere tutte le foglie dall'albero,
la funzione è questa:
template <class T>
void UtilTree<T>::RemoveLeavesTree(){
     typename BinAlberoC<T>::Nodo u;
     T a;
     int k = 0;
     int j = 0;

     tree.popolaBinAlbero();
     tree.printBinAlbero(tree.binRadice());
     u = tree.binRadice();
         
    while(u!= -1){
               if(tree.sinistroVuoto(u) && tree.destroVuoto(u))
                  tree.cancellaFoglie(tree.leggiNodo(u),u);
               else if(tree.foglia(tree.figlioSinistro(u)))
                       {
                       tree.cancFogliaSx(tree.leggiNodo(tree.figlioSinistro(u)),tree.figlioSinistro(u));
                       k++;
                       }
               else if(tree.foglia(tree.figlioDestro(u)))
                       {
                       tree.cancFogliaDx(tree.leggiNodo(tree.figlioDestro(u)),tree.figlioDestro(u));     
                       j++;
                       }
                       
               if(j > 0)
                        {
                        u = tree.figlioSinistro(u);
    		            j = 0;
                        }     
                                
               else if (k > 0)
                             {
   	                       	 u = tree.figlioDestro(u);
                             k = 0;
                             }
                          
               else 
                    u = tree.figlioDestro(u);  
                
                    
     }
          
    tree.printBinAlbero(tree.binRadice());
	cout << endl;

}
tutte le varie funzioni e specifiche presenti sono già presenti in un secondo file header(.h) e funzionano.

Il mio problema è nel ciclo while, perchè l'eliminazione delle foglie avviene con successo nel primo ramo analizzato, non riesco a capire come fare per ritornare alla radice dell'albero e analizzare l'altro ramo.

Grazie

3 Risposte

  • Re: Cancella foglie albero

    Se usi la ricorsione ti viene piu facile, non dovrai mettere piu nessun ciclo
  • Re: Cancella foglie albero

    Come si applica la ricorsione eliminando il ciclo?
  • Re: Cancella foglie albero

    Ho cercato di implementare la ricorsione come mi è stato suggerito, il risultato è questo:
    
    template <class T>
    int UtilTree<T>::Even_leafs(BinAlberoC<T>, int &numfogpari){
    	typename BinAlberoC<T>::Nodo u;
    	T a;
    	/* costruzione popolamento dell'albero
    	tree.popolaBinAlbero();
        cout << "\nStampa dell'albero inserito: \n";
        tree.printBinAlbero(tree.binRadice());
        cout << endl << endl;
    	*/ 
        u = tree.binRadice();
        cout << "foglie:" << numfogpari << endl;
        
        if(u != -1){
        	if(tree.sinistroVuoto(u) && tree.destroVuoto(u)){
    				if(tree.leggiNodo(u)%2 == 0)
    					numfogpari++;
    		}
    		if(!tree.sinistroVuoto(u)){
    				Even_leafs(tree.figlioSinistro(u), numfogpari);
    		}
    		if(!tree.destroVuoto(u)){
    				Even_leafs(tree.figlioDestro(u), numfogpari);
    		}
        }
        
    	cout << "Il numero totale di foglie con valore pari e': " << numfogpari << endl;
    }
    
    non funziona come dovrebbe perchè la variabile numfogpari mi da come valore 20 a prescindere dal numero di foglie.

    per aiutare la comprensione della funzione vi scrivo cosa fanno le funzioni:
    BinAlberoC: richiama la libreria che contiene tutte le specifiche dell'albero.
    BinRadice: è il nodo della radice.
    sinistroVuoto & destroVuoto: restituiscono un bool se il nodo "u" ha figli o meno.
    leggiNodo: legge il contenuto del nodo "u".

    Mi aiutate a risolvere questo problema? devo sempre trovare le foglie il cui valore è pari.
    Grazie mille.
Devi accedere o registrarti per scrivere nel forum
3 risposte