[C] Albero binario di ricerca con doppioni

di il
2 risposte

[C] Albero binario di ricerca con doppioni

Salve ragazzi,
sto studiando gli alberi, in particolari gli alberi binari di ricerca.
L'esercizio che sto provando a svolgere è il seguente:

Dato un albero binario di ricerca, si implementino (con la strategia più efficiente) le funzioni di inserimento e cancellazione in modo che in tale albero possano essere inseriti chiavi uguali. Quali sono le prestazioni asintotiche delle funzioni modificate?


Io ho iniziato a creare le due funzioni richieste, e per l'inserimento delle chiavi uguali, nella funzione "inserisci" al posto di > e < avevo messo >= e <= , ma secondo me è troppo banale e come soluzione non va bene...Per la cancellazione invece, non ho proprio idea ! Come potrei fare? Grazie in anticipo!
#include <stdio.h>
#include <stdlib.h>
struct nodo{
	int info;
	struct nodo *sinistro, *destro;
	};


struct nodo *inserisci(struct nodo *radice, int e){
	struct nodo *aux;
    if(radice==NULL){
        aux=malloc(sizeof(struct nodo));
        if(aux){
           aux->info=e;
           aux->sinistro=aux->destro=NULL;
           return aux;
        }
        else 
		printf("Memoria non allocata" );
    }
    else if(e<radice->info){
	  radice->sinistro = inserisci(radice->sinistro,e);
	  //printf("X\n");
    }
    else if(e>radice->info){
	  radice->destro = inserisci(radice->destro,e);
	  //printf("Y\n");
    }
return radice;
}  


void stampa(struct nodo *abr){
	if(abr!=NULL){
      stampa(abr->sinistro);
	  printf("%d \n",abr->info);
	  stampa(abr->destro);
    }
}


int main(){
	int n,i,el;
	struct nodo *abr=NULL;
	printf("Quanti nodi vuoi inserire\n");
	scanf("%d",&n);
	for(i=0;i<n;i++){
		printf("Inserisci nodo: ");
		scanf("%d",&el);
		abr=inserisci(abr,el);
		
	}
	stampa(abr);
	system("PAUSE");	
  return 0;
}

2 Risposte

  • Re: [C] Albero binario di ricerca con doppioni

    Per il problema dell'inserimento è giusta la tua soluzione non è banale è quella ahaha solo che per convezione i nodi <= vanno a sx e > a dx.
    Per eliminare un nodo la ricerca del nodo è sostanzialmente la stessa cosa se è < al nodo vai a sx se è maggiore a dx, ricorda che prima di eliminarlo devi collegare il nodo padre al sottoalbero di dx del nodo che devi eliminare mentre il sottoalbero di sx lo colleghi all'ultima foglia di sx del ramo che hai collegato al padre (se quest'ultimo non è foglia, altrimenti elimini direttamente).
  • Re: [C] Albero binario di ricerca con doppioni

    La soluzione per l'inserimento è giusta, anche se nel tuo algoritmo non vedo la condizione <= oppure >= che permetta di inserire il nuovo nodo a sinistra o a destra della radice passata come parametro. Solitamente se un nuovo sott'albero ha l'etichetta uguale alla radice presa in considerazione, il sott'albero viene inserito a destra( dove i valori sono maggiori della radice), quindi nella condizione e>=radice->info.

    Per l'eliminazione, il ragionamento diventa più complesso. Tieni conto di due casi:
    -Devi eliminare una radice che ha solo un figlio sinistro o un figlio destro(in questo caso è semplice l'eliminazione, il sott'albero sinistro o destro prenderà il posto del padre).
    -Devi eliminare una radice che ha entrambi i figli E qui ti lascio ragionare un po'.
Devi accedere o registrarti per scrivere nel forum
2 risposte