Come da titolo devo implementare in C++ una classe che rappresenti un albero generico con un metodo che mi restituisca la profondità
(La radice r ha profondità 0, i suoi figli hanno profondità 1, i nipoti profondità 2 e così via).
La classe albero ha una interfaccia molto semplice:
(GLinkedList è una classe creata da me che consiste semplicemente in una lista linkata)
al momento ho implementato la funzione depth() in questo modo: ma ritorna sempre dei valori più alti di quanto dovrebbecodice:#include "GLinkedList.h" template<class T> class GTreeIterator; //questa classe serve per navigare attraverso l'albero, aggiungere figli, leggere e settare i valori dei nodi. Non la riporto per brevità //---------------------------------------------------------------------------------------- //Class GTree : every node stores one <dataType> , have one parent and a list of children //---------------------------------------------------------------------------------------- template<class T> class GTree { friend class GTreeIterator<T>; typedef GTree<T> Node; public: GTree(void) : _parent(nullptr) {} explicit GTree(const T& nodeValue) : _data(nodeValue), _parent(nullptr) {} virtual ~GTree(void) {clearChildren();} //delete all children from this node inline void clearChildren() { //salto il codice per brevità } //return total number of nodes inline int size() const { //salto il codice per brevità } inline const T& value() const {return _data;} inline void setValue(const T& v) {_data=v;} inline bool haveChildren() const {return !_children.isEmpty();} //0==only root, 1==root children are leafs, and so on int depth() const; private: //TODO: copy GTree(const GTree<T>&); GTree<T>& operator=(const GTree<T>&); T _data; Node* _parent; GLinkedList<Node*> _children; }; //EO class GTree
Quello che ho pensato di fare è questo:codice:template<class T> int GTree<T>::depth() const { if( haveChildren() ) { int c =1, temp=0; GList_ConstIterator<Node*> itr = _children.const_begin(); while( itr.isValid() ) { //itr.data() in questo caso resituisce un puntatore al nodo figlio temp += itr.data()->depth(); ++itr; if(temp>c) c=temp; } return c; } else return 0; }
Se un nodo non ha figli torno 0.
Se ha figli:
- controllo ogni figlio
- richiamo la funzione in modo ricorsivo in modo da controllare tutti i nodi
- prendo il valore massimo (sostanzialmente il figlio che ha più nipoti)
spero che qualcuno possa aiutarmi perchè mi sento vicino alla soluzione ma non riesco a vedere l'errore nel mio ragionamento.
Grazie anticipatamente

Rispondi quotando