Cancellazione Nodo Albero Binario.

di il
5 risposte

Cancellazione Nodo Albero Binario.

Come si implementa in codice l'eliminazione di un nodo all'interno di un albero binario di puntatori?
Ho capito la teoria, ma non riesco ad implementare il codice. Io utilizzo questa struttura
typedef struct _nodo{
              int ch;
               nodo *fdx;
               nodo *fsx;
}nodo;
Se qualcuno potrebbe riuscire ad aiutarmi. Grazie.

5 Risposte

  • Re: Cancellazione Nodo Albero Binario.

    Come lo faresti in teoria?
  • Re: Cancellazione Nodo Albero Binario.

    Allora abbiamo più casi, prima di cancellare il nodo:
    1) Albero vuoto: non viene realizzata alcuna cancellazione;
    2) L’elemento el < radice albero: la cancellazione va effettuata nel sottoalbero sinistro; elimina(radice->sinistro,el);
    3) L’elemento el > radice albero: la cancellazione va effettuata nel sottoalbero destro; elimina(radice->destro,el);
    4) L’elemento el==radice albero. Si considerano i seguenti casi:
    5) La radice è una foglia.
    6) Il nodo ha un sottoalbero non vuoto e l’altro vuoto.
    7) Il nodo ha entrambi i sottoalberi non vuoti.
    Questi sono i vari casi, ma in codice non riesco ad implementarlo nessuno.
  • Re: Cancellazione Nodo Albero Binario.

    Allora caso 1 si spiega da solo.
    Caso 2,3 ti riportano alla chiamata ricorsiva della stessa funzione finchè arrivi al caso 4. Nel caso 4 fai le distinzioni.
    Se caso 5 , elimini e via.
    Se caso 6,7 aggisci di conseguenza.

    Tutto questo ha senso se prima sai come creare un albero binario. Per una implementazione possibile di creazione albero puoi vedere quà:
    http://it.wikipedia.org/wiki/Albero_binari
  • Re: Cancellazione Nodo Albero Binario.

    Si ok, finora ho fatto tutto, mi manca solo la cancellazione che non ho capito come si fa, ecco quà il mio codice con tutto il resto con la visualizzazione in pre,in,post e l'inserimento:
    #include <iostream>
    using namespace std;
    typedef struct _nodo{
        int ch;
        _nodo *sx;
        _nodo *dx;
    }nodo;
    nodo *ins(nodo *root, nodo *nuovo){
        if (root==NULL)
    		return nuovo;
    	else{
    		
    		if (nuovo->ch < root->ch)
    			root->sx=ins(root->sx,nuovo);
    		else
    			root->dx=ins(root->dx,nuovo);
    		return root;
    	}
    }
    void pre_ordine (nodo *a){
        if(a==NULL)
    		return;
    	cout<<a->ch;
    	if(a->sx!=NULL)
    		pre_ordine(a->sx);
    	if(a->dx!=NULL)
    		pre_ordine(a->dx);
    	return;
    }
    void post_ordine (nodo *a){
        if  (a==NULL)
    		return;
    	if(a->sx!=NULL)
    		post_ordine(a->sx);
    	if(a->dx!=NULL)
    		post_ordine(a->dx);
    	cout<<a->ch;
    	return;
    }
    void in_ordine (nodo *a){
        if  (a==NULL)
    		return;
    	if(a->sx!=NULL)
    		in_ordine(a->sx);
    	cout<<a->ch;
    	if(a->dx!=NULL)
    		in_ordine(a->dx);
    	return;
    }
    int main(){
        nodo *root=NULL;
        nodo *ipo;
        int scelta;
        do{
    		cout<<"1_Per Effettuare L'inserimento"<<endl;
    		cout<<"2_Per Effettuare il Pre-Ordine"<<endl;
    		cout<<"3_Per Effettuare il Post-Ordine"<<endl;
    		cout<<"4_Per Effettuare l' In-Ordine"<<endl;
    		cout<<"5_Esci"<<endl;  
    		cin>>scelta;  
    		switch (scelta){
    			case 1:
    				ipo = new nodo;
    				cout<<"Inserisci  il numero che vuoi inserire nel T.B"<<endl;
    				cin>>ipo->ch;
    				ipo->dx = NULL;
    				ipo->sx = NULL;
    				root = ins(root,ipo);
    				break;
    			case 2:
    				cout<<"Ecco il suo visualizza B.T. con il pre-ordine"<<endl<<endl;
    				pre_ordine(root);
    				cout<<endl;
    				break;
    			case 3:
    				cout<<"Ecco il suo visualizza B.T. con il post-ordine"<<endl<<endl;
    				post_ordine(root);
    				cout<<endl<<endl;
    				break;
    			case 4:
    				cout<<"Ecco il suo visualizza B.T con l'in-ordine"<<endl<<endl;
    				in_ordine(root);
    				cout<<endl<<endl;
    				break;
    		}
        }while(scelta<5);
    }
    
    
      
    Adesso, però devo aggiungere la funzione della cancellazione, che non riesco a fare.
  • Re: Cancellazione Nodo Albero Binario.

    Possiamo iniziare insieme.
    
    nodo * canc(nodo *root,int valore)
    {
    	if(root == NULL) //caso 1
    		return root;
    	if(valore < root->ch) //caso 2
    		return canc(root->sx,valore);
    	else if(valore > root->ch) //caso 3
    		return canc(root->dx,valore);
    	else if(valore == root->ch) //caso 4
    	{
    
    	}
    }
    
    prova a fare il resto.
Devi accedere o registrarti per scrivere nel forum
5 risposte