Per le strutture dati lineari è stato facile, nessun problema.... la disgrazia mi si presenta sempre sulle strutture ad albero forse perchè ho sbagliato qualcosa in fase di progettazione, non riesco a venirne a capo! Questa qui è la bozza della mia classe Albero N- Ario
template <class Element>
class Nary_Tree
{
public:
Nary_Tree();
Nary_Tree(const Element root);
Nary_Tree(size_t nodes, size_t start_range, size_t end_range);
Nary_Tree(Tree_Node<Element>* root);
Nary_Tree(const Nary_Tree<Element>& to_copy);
~Nary_Tree();
Tree_Node<Element>* get_root();
size_t get_height();
size_t get_size();
Nary_Tree<Element>& get_first_sub_tree();
Nary_Tree<Element>& get_sub_tree(size_t pos);
void set_root(Element new_root);
void set_first_sub_tree(const Element first);
void set_sub_tree(const Element child);
//utility
bool is_empty();
void refresh();
void remove_sub_tree(Nary_Tree<Element>& sub_tree);
//visit
void pre_order(Tree_Node<Element>* node, void(*fn)(Tree_Node<Element>*));
void post_order(Tree_Node<Element>* node , void(*fn)(Tree_Node<Element>*));
void breadth_first_order();
List<Element>* breadth_first(Tree_Node<Element>* node); //optional...
/* overload ... */
private:
Tree_Node<Element> * root_;
size_t height_;
size_t size_;
}
Questa invece è una bozza di una funzione il cui compito è quello di contare le occorrenze del verificarsi di una condizione passata come parametro ( Predicate è il segnaposto per un function object,almeno spero di averlo implementato nella maniera migliore )
// the idea is to count occurrences in which the condition is true
template<class Tree, class Predicate>
int count_if(Tree nary_tree , Predicate condition)
{
int counter = 0;
nary_tree.post_order(nary_tree.get_root(), //Help);
...
...
...
return counter;
}
Ora assumendo che l' approccio sia giusto(non ne ho la certezza, poichè è la mia prima esperienza sul paradigma object oriented)il problema che mi si presenta è che formalmente non ho idea di come riscrivere l argomento dei prototipi dei metodi di visita [ mi riferisco ad esempio al pre_order(Tree_Node<Element>*,void (fn*)(questa roba qui)]... Secondo voi è possibile procedere in questo modo ? o conviene trovare un altra soluzione del tutto differente? Vi prego aiutatemi