Eliminazione nodo albero binario con sottoalberi sx e dx

di il
1 risposte

Eliminazione nodo albero binario con sottoalberi sx e dx

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

1 Risposte

Devi accedere o registrarti per scrivere nel forum
1 risposte