Ciao a tutti ragazzi!
Sto cercando di implementare una funzione per la cancellazione di un nodo da un'albero binario ordinato. Sono riuscito a fare tutto tranne l'eliminazione del nodo con entrambi i sottoalberi non vuoti. Come si può vedere dal codice, se il nodo da cancellare è una foglia, lo elimino e basta. Se ha un solo sottoalbero, lo collego e basta... se invece ha entrambi i sottoalberi non riesco a farlo funzionare. Ho letto la spiegazione dal libro e concettualmente mi pare abbastanza semplice. Se ho ben capito basta collegare uno qualsiasi dei due sottoalberi al padre del padre (il nonno ) e sistemare l'altro sottoalbero come se si stesse inserendo un nuovo nodo, cioè trovandogli la posizione corretta.
Ovviamente non ci vuole niente a collegare uno dei due sottoalberi, il problema è che non riesco poi a collegare l'altro sottoalbero.
Ecco il mio codice: (mi riferisco alla funzione cancella_nodo)
#include<iostream>
using namespace std;
struct nodo{
int info;
nodo *sx;
nodo *dx;
};
void insert(nodo *&root,nodo *&nuovo);
void printtree(nodo *root);
void cancella_nodo(nodo *&root,int x);
int main(){
int n,x;
nodo *root=NULL;
cout<<"Quanti nodi vuoi inserire? ";
cin>>n;
for(int i=0;i<n;i++){
nodo *nuovo=new nodo;
nuovo->sx=NULL;
nuovo->dx=NULL;
cout<<"Valore nodo "<<i+1<<": ";
cin>>nuovo->info;
insert(root,nuovo);
}
cout<<"L'albero e': "<<endl;
printtree(root);
cout<<"Quale nodo vuoi cancellare? ";
cin>>x;
cancella_nodo(root,x);
printtree(root);
return 0;
}
void insert(nodo *&root,nodo *&nuovo){
if(root==NULL)
root=nuovo;
else{
if(root->info>=nuovo->info){
insert(root->sx,nuovo);
}else{
insert(root->dx,nuovo);
}
}
}
void printtree(nodo *root){
if(root!=NULL){
cout<<root->info<<endl;
printtree(root->sx);
printtree(root->dx);
}
}
void cancella_nodo(nodo *&root,int x){
if(root!=NULL){
//cancellazione nel sottoalbero sx
if(root->info>x)
cancella_nodo(root->sx,x);
else{
//cancellazione nel sottoalbero dx
if(root->info<x)
cancella_nodo(root->dx,x);
else{
//se ho trovato il nodo da cancellare
if(root->info==x){
//se il nodo da cancellare e' una foglia lo elimino e basta
if(root->sx==NULL&&root->dx==NULL)
root=NULL;
else{
//se il nodo da cancellare ha solo il sottoalbero dx, collego il sottoalbero dx
if(root->sx==NULL)
root=root->dx;
else
//se il nodo da cancellare ha solo il sottoalbero sx, collego il sottoalbero sx
if(root->dx==NULL)
root=root->sx;
else{
//caso con 2 sottoalberi???
}
}
}
}
}
}
}
Qualcuno può aiutarmi a risolvere il problema? Grazie mille