ok prima di tutto qualche errore di fondo.
Hai dichiarato il puntatore alla radice come pubblico !!! Non dovevi ! quel puntatore è chiaramente un dato privato, serve solo ai metodi della classe stessa, e va inizializzato nel costruttore come tu giustamente hai fatto, altrimenti addio programmazione a oggetti !!! Ti immagini cosa succederebbe se un cliente modificasse (e lo può fare dato che è pubblico) quel puntatore? l'intero albero si perderebbe nel nulla!
ele_albero non dovrebbe essere una classe (non ha metodi!) ma una semplice struct! il che oltretutto evita quella bruttura di friend, che sporca il codice ed è un'altra violazione inutile del paradigma a oggetti (come usare un goto in programmazione strutturata)
Come conseguenza a quello che ho detto prima, nessun metodo che operi sull'albero (inserimenti, ricerche, cancellazioni, visite ecc ecc) deve avere come argomento il puntatore all'albero!!! A che serve??? Ovviamente per fare ricorsioni ti devi appoggiare su funzioni ausiliarie (private !!!)
Ad esempio, un semplice metodo che cerca le foglie :
// questa è pubblica
void Albero::cerca_foglie()
{
rec_cerca_foglie( root_pointer );
}
//questa è privata !
void Albero::rec_cerca_foglie( ele_albero * ele )
{
if ( ele->left ) rec_cerca_foglie( ele->left ); // c'è un figlio sx, ricorri a sx
if ( ele->right ) rec_cerca_foglie( ele->right); // c'è un figlio dx, ricorri a dx
if ( (ele->left == NULL) && (ele->right == NULL) ) std::cout << "Foglia, valore : " << ele->value << std::endl ;
// non ci sono figli, quindi è una foglia e scrive il valore
}
Il tuo algoritmo di cancellazione delle foglie a prima vista mi sembra vada bene, riscrivi il codice seguendo i suggerimenti; ti sarà sfuggito qualcosa...
PS quello che hai implementato tu è un albero binario di ricerca, i problemi con queste strutture arrivano quando li devi bilanciare!!! E in effetti un albero sbilanciato è abbastanza inutile...

Rispondi quotando