Classi con struttura dati albero binario di ricerca

di il
2 risposte

Classi con struttura dati albero binario di ricerca

Ho implementato la seguente struttura dati di un albero binario di ricerca utilizzando la classe ma ho diverse perplessità:

struct node {
	int info;
	node *left, *right;

	node(int info):
		left(NULL),
		right(NULL) {};
};

class treebin {
   node* root;
   
   public: 
      treebin() { root = NULL; };
      node* getroot() { return root; };
}

Se desiderassi implementare la funzione di inserimento di un nodo tramite funzione ricorsiva,
definirei il metodo inserisci nella sezione public, il quale richiama il metodo insert della sezione private.

class treebin {
   node* root;
   void insert(int value, node* tree);
   
   public: 
      treebin() { root = NULL; };
      node* getroot() { return root; };
      void inserisci(int valore) { void insert(valore, root) };
}

treebin::insert(int value, node* tree) {
   ...
funzione ricorsiva inserimento del nuovo nodo
   ...
}

int main() {
   treebin abr;
   int val=2;
   
   abr.inserisci(val);
}


Mi viene in mente questa alternativa:

class treebin {
   node* root;
   
   public: 
      treebin() { root = NULL; };
      node* getroot() { return root; };
      void inserisci() { void insert(root) };
}

treebin::inserisci(int value, node* tree) {
   ...
funzione ricorsiva inserimento del nuovo nodo
   ...
}

int main() {
   treebin abr;
   int val=2;
   
   abr.inserisci(val, abr.getroot());

Secondo voi sono entrambi corretti i due approcci e nel caso quale scegliereste? Io il secondo visto che mi sembra più lineare e semplice.
thanks

2 Risposte

  • Re: Classi con struttura dati albero binario di ricerca

    Molto meglio il primo e toglierei pure la getroot() che è fonte di danni potenziali dato che espone un dettaglio impementativo.
    In fondo ciò che interessa all'utente è il dato (inserimento, ricerca etc...) e non come è fatta la classe internamente.
  • Re: Classi con struttura dati albero binario di ricerca

    Ok vada per il primo, immagino perchè così possiamo isolare la parte relativa al puntatore e quindi chi utilizza il metodo inserisci dall'esterno della classe può utilizzare solo come parametro di ingresso il valore da inserire nell'albero, mentre l'accesso al metodo privato insert rimane esclusivo solo da parte dei metodi interni alla classe e pertanto nascosti alla funzioni esterne alla classe, corretto?
    Se devo implementare una funzione ricorsiva devo per forza passargli un puntatore, ragion mi occorre un secondo metodo (insert) che richiamerò nel metodo pubblico (inserisci) al quale passerò solo il parametro corrispondente al valore.
    Giusto?

    Forse se non usassi la ricorsione verrebbe più lineare tutto...
Devi accedere o registrarti per scrivere nel forum
2 risposte