26 #ifndef MLN_UTIL_TREE_HH
27 # define MLN_UTIL_TREE_HH
33 # include <mln/core/contract.hh>
49 template <
typename T>
class tree_node;
50 template <
typename T>
class tree;
51 template <
typename T>
class branch;
148 void print(std::ostream& ostr,
int level = 0);
178 std::vector< tree_node<T>* > child_;
186 template <
typename T>
248 template <
typename T>
281 # ifndef MLN_INCLUDE_ONLY
283 template <
typename T>
290 template <
typename T>
295 mln_assertion (root != 0);
298 template <
typename T>
306 template <
typename T>
311 return branch<T>(*
this, *root());
314 template <
typename T>
319 tree_node<T>* n =
new tree_node<T> (elt);
320 root_->set_parent(n);
321 n->children().push_back (root_);
325 template <
typename T>
330 tree_node<T>* n =
new tree_node<T> (elt);
331 root_->child_.push_back (n);
335 template <
typename T>
340 return root()->check_consistency ();
343 template <
typename T>
350 template <
typename T>
358 template <
typename T>
366 template <
typename T>
375 template <
typename T>
377 std::vector< tree_node<T>* >&
383 template <
typename T>
385 const std::vector< tree_node<T>* >&
391 template <
typename T>
396 tree_node<T>* s =
new tree_node<T>(elt);
399 this->child_.push_back(s);
404 template <
typename T>
409 if (tree_node->parent_)
411 for (
typename std::vector<util::tree_node<T>* >::iterator it = tree_node->parent()->children().begin();
412 it != tree_node->parent()->children().end(); ++it)
413 if ((*it) == tree_node)
415 tree_node->parent()->children().erase(it);
419 tree_node->parent_ =
this;
420 this->children().push_back(tree_node);
424 template <
typename T>
429 mln_assertion(parent_ != 0);
430 tree_node<T>* res = parent_;
432 typename std::vector<tree_node<T>* >::iterator it = parent_->children().begin();
433 for (; it < parent_->children().end(); ++it)
436 parent_->children().erase(it);
440 for (
typename std::vector<tree_node<T>* >::iterator it = this->child_.begin();
441 it != this->child_.end(); ++it)
442 parent_->add_child(*it);
446 template <
typename T>
451 ostr << level << std::endl;
453 ostr <<
" elt " << this->elt() << std::endl;
456 for (
typename std::vector<tree_node<T>* >::iterator it = this->child_.begin();
457 it != this->child_.end(); ++it)
459 (*it)->print(level + 1);
464 template <
typename T>
469 mln_assertion(parent != 0);
471 parent->child_.push_back(
this);
474 template <
typename T>
482 template <
typename T>
487 if (elt == this->elt_)
494 for (
typename std::vector<tree_node<T>* >::iterator it = this->child_.begin();
495 it != this->child_.end(); ++it)
497 if ((**it).search_rec(res, elt))
504 template <
typename T>
509 tree_node<T>* res = 0;
511 if (search_rec(&res, elt))
516 template <
typename T>
521 for (
typename std::vector<tree_node<T>* >::iterator it = this->child_.begin();
522 it != this->child_.end(); ++it)
524 if ((**it).parent() !=
this)
527 if (!((**it).check_consistency()))
535 template <
typename T>
538 util::tree_node<T>& apex)
545 template <
typename T>
553 template <
typename T>
561 # endif // ! MLN_INCLUDE_ONLY
569 #endif // ! MLN_UTIL_TREE_HH