Stampa il sottoalbero di un valore X presente in un albero

di
Anonimizzato27045
il
5 risposte

Stampa il sottoalbero di un valore X presente in un albero

Buonasera a tutti ragazzi, da un po' ho iniziato a studiarae gli Alberi Binari, e di conseguenza a scrivere funzioni ricorsive.
Oggi, dopo un bel po' di esercizi, mi son bloccato e vi pongo subito il testo:
Scrivi una funzione che, dato un elemento di un albero binario, visualizzi il sottoalbero che ha tale elemento come radice.
Parto col dirvi che ho già scritto una funziona per la stampa in pre-order: pOrder(Albero* root)

Questa invece è la funzione che richiede l'esercizio:
void printSubtree(Albero* root, int key_toFind)
{
	if (root == nullptr) //Se inesistente
		return;
	if (root->info == key_toFind) //Valore trovato
	{
		pOrder(root); //Chiama la funzione per la stampa in pre-order, passando la radice-chiave
		return;
	}
	
	printSubtree(root->left, key_toFind);
	printSubtree(root->right, key_toFind);
}
Nel caso che il valore non venga trovato, la funzione viene richiamata prima a sinistra e poi a destra.
printSubtree(root->left, key_toFind);
printSubtree(root->right, key_toFind);
Il problema è che se arrivo a questo punto printSubtree(root->left, key_toFind) e trovo la radice-chiave, dopo aver richiamato pOrder(root), continua poi con printSubtree(root->right, key_toFind), con il rischio che trova un altro valore uguale e stampa un secondo, o terzo... sottoalbero.
Consigli su come fermare il tutto dopo aver stampato il primo sottoalbero?

5 Risposte

  • Re: Stampa il sottoalbero di un valore X presente in un albero

    
    void printSubtree(Albero* root, int key_toFind, int init)
    {
     static int found = 0;
      if (init)
          found = 0;
      	
    	if (root == nullptr) //Se inesistente
    		return;
    	if (root->info == key_toFind) //Valore trovato
    	{
    		pOrder(root); //Chiama la funzione per la stampa in pre-order, passando la radice-chiave
    		found = 1;
    		return;
    	}
    	
    	printSubtree(root->left, key_toFind, 0);
    	if(!found)
    		printSubtree(root->right, key_toFind, 0);
    }
    
  • Re: Stampa il sottoalbero di un valore X presente in un albero

    Che stupido, avevo davvero dimenticato l'utilità di static.
    Non ho capito l'utilizzo di int init.
    Alla fine ho risolto, anche se sono presenti piu' elementi uguali, sia a sinistra che a destra.
    void printSubtree(Albero* root, int key_toFind)
    {
    	static bool found = false;
    
    	if (root == nullptr)
    		return;
    	if (root->info == key_toFind)
    	{
    		pOrder(root);
    		found = true;
    		return;
    	}
    
    	printSubtree(root->left, key_toFind);
    	if (!found)
    		printSubtree(root->right, key_toFind);
    }
  • Re: Stampa il sottoalbero di un valore X presente in un albero

    Se non resetti la variabile statica, la funzione funziona sì, ma una volta sola
  • Re: Stampa il sottoalbero di un valore X presente in un albero

    Giusto, quindi quando viene richiamato dal main deve essere passato di default a 1 così da assegnare a found il valore 0 ?
  • Re: Stampa il sottoalbero di un valore X presente in un albero

Devi accedere o registrarti per scrivere nel forum
5 risposte