28 # ifndef TPL_DYNSETTREE_H 29 # define TPL_DYNSETTREE_H 32 # include <ah-args-ctor.H> 33 # include <ahIterator.H> 34 # include <tpl_binNodeUtils.H> 35 # include <tpl_binNodeXt.H> 36 # include <tpl_binTree.H> 37 # include <tpl_treap.H> 38 # include <tpl_treapRk.H> 40 # include <tpl_rand_tree.H> 41 # include <tpl_rb_tree.H> 43 # include <tpl_splay_tree.H> 45 using namespace Aleph;
58 template <
typename Key,
59 template <
typename,
class>
class Tree = Avl_Tree,
60 class Compare = Aleph::less<Key>>
64 public GenericKeys<DynSetTree<Key, Tree, Compare>, Key>,
66 public StlAlephIterator<DynSetTree<Key, Tree, Compare>>
72 using Node =
typename Tree<Key, Compare>::Node;
74 using Tree_Type = Tree<Key, Compare>;
78 static const size_t dim = 13;
80 mutable Tree<Key, Compare> tree;
87 typedef Key Item_Type;
99 std::swap(num_nodes, dset.num_nodes);
104 : tree(cmp), num_nodes(0)
111 : tree(srcTree.tree.get_compare()), num_nodes(srcTree.num_nodes)
113 Node * srcRoot = srcTree.tree.getRoot();
116 tree.getRoot() =
copyRec(srcRoot);
147 if (
this == &srcTree)
150 Node *src_root = (
Node*) const_cast<DynSetTree&>(srcTree).tree.getRoot();
154 tree.getRoot() =
copyRec(src_root);
155 num_nodes = srcTree.num_nodes;
175 Key * __insert(
Node * p)
177 if (tree.search_or_insert(p) != p)
182 return &p->get_key();
197 return __insert(
new Node(key));
202 return __insert(
new Node(std::forward<Key>(key)));
205 Key * append(
const Key & key)
210 Key * append(Key && key)
212 return insert(std::forward<Key>(key));
217 Key * __search_or_insert(
Node * p)
219 Node * q = tree.search_or_insert(p);
225 return &q->get_key();
228 pair<Node*, bool> __contains_or_insert(
Node * p)
230 Node * q = tree.search_or_insert(p);
234 return pair<Node*, bool>(q,
true);
237 return pair<Node*, bool>(p,
false);
256 return __search_or_insert(
new Node(key));
261 return __search_or_insert(
new Node(std::forward<Key>(key)));
277 pair<Key*, bool> contains_or_insert(
const Key & key)
279 auto p = __contains_or_insert(
new Node(key));
280 return pair<Key*, bool>(&p.first->get_key(), p.second);
283 pair<Key*, bool> contains_or_insert(Key && key)
285 auto p = __contains_or_insert(
new Node(std::forward<Key>(key)));
286 return pair<Key*, bool>(&p.first->get_key(), p.second);
291 Key * __insert_dup(
Node * q)
293 Node * p = tree.insert_dup(q);
295 return &p->get_key();
300 Key * insert_dup(
const Key & key)
302 return __insert_dup(
new Node(key));
305 Key * insert_dup(Key && key)
307 return __insert_dup(
new Node(std::forward<Key>(key)));
310 Key * put(
const Key & key)
315 Key * put(Key && key)
317 return insert(std::forward<Key>(key));
327 size_t remove(
const Key & key)
329 Node * p =
static_cast<Node*
>(tree.remove(key));
351 Node * p =
static_cast<Node*
>(tree.remove(key));
354 throw domain_error(
"DynSetTree::del key is not found in the tree");
356 auto ret_val = p->get_key();
374 Node * p =
static_cast<Node*
>(tree.remove_pos(i));
375 const Key ret_val =
KEY(p);
390 bool has(
const Key & key)
const 395 bool contains(
const Key & key)
const 414 Key &
find(
const Key & key)
const 416 Node * node =
static_cast<Node*
>(tree.search(key));
419 throw std::domain_error(
"key not found");
421 return node->get_key();
441 return std::pair<int, Key*> (0,
nullptr);
443 std::pair<int, Node*> p = tree.find_position(key);
445 return std::pair<int, Key*> (p.first, &p.second->get_key());
464 Node * node =
static_cast<Node*
>(tree.search(key));
469 return &(node->get_key());
477 throw std::domain_error(
"set is empty");
479 return find_min(tree.getRoot())->get_key();
490 throw std::domain_error(
"set is empty");
492 return find_max(tree.getRoot())->get_key();
499 const Key &
get()
const {
return max(); }
502 const size_t &
size()
const {
return num_nodes; }
514 Node * get_root_node()
const {
return tree.getRoot(); }
516 const Key & get_root()
const 519 throw std::domain_error(
"Tree is empty");
520 return KEY(tree.getRoot());
524 const Key &
get_item()
const {
return get_root(); }
534 Node * root =
static_cast<Node*
>(tree.getRoot());
552 std::pair<long, Node*> p = tree.position(key);
563 return tree.select(i)->get_key();
566 const Key &
select(
const size_t & i)
const 568 return tree.select(i)->get_key();
571 Key & operator () (
const size_t & i)
576 const Key & operator [] (
const Key & key)
const 581 const Key & operator [] (
const Key & key)
586 Key & access (
const size_t & i)
593 return tree.verify() and
check_bst(tree.getRoot());
598 template <
class Key_Op>
603 Node_Op(Key_Op & __key_op) : key_op(__key_op) { }
605 Node_Op(Key_Op && __key_op) : key_op(__key_op)
610 void operator () (
Node * root)
612 assert(root !=
nullptr);
643 template <
class Key_Op>
646 Node * root = (
Node *) tree.getRoot();
648 Node_Op <Key_Op> node_op(const_cast<Key_Op&>(key_op));
654 template <
class Key_Op>
657 for_each_preorder<Key_Op>(key_op);
684 template <
class Key_Op>
687 Node * root = (
Node *) tree.getRoot();
689 Node_Op <Key_Op> node_op(const_cast<Key_Op&>(key_op));
695 template <
class Key_Op>
698 for_each_inorder<Key_Op>(key_op);
725 template <
class Key_Op>
728 Node * root = (
Node *) tree.getRoot();
730 Node_Op <Key_Op> node_op(const_cast<Key_Op&>(key_op));
736 template <
class Key_Op>
739 for_each_postorder<Key_Op>(key_op);
759 tree.
join(t.tree, dup.tree);
785 t.tree.getRoot() = Node::NullPtr;
786 num_nodes =
COUNT(tree.getRoot());
807 if (not tree.split_key(key, l.tree, r.tree))
810 tree.getRoot() = Node::NullPtr;
812 l.num_nodes =
COUNT(l.tree.getRoot());
813 r.num_nodes =
COUNT(r.tree.getRoot());
833 tree.split_pos(pos, l.tree, r.tree);
835 l.num_nodes =
COUNT(l.tree.getRoot());
836 r.num_nodes =
COUNT(r.tree.getRoot());
853 tree.split_key_dup(key, l.tree, r.tree);
854 tree.getRoot() = Node::NullPtr;
856 l.num_nodes =
COUNT(l.tree.getRoot());
857 r.num_nodes =
COUNT(r.tree.getRoot());
860 struct Iterator :
public Tree_Type::Iterator
862 using Base =
typename Tree_Type::Iterator;
866 Iterator(
const DynSetTree & tree) : Base(tree.tree) { }
868 const Key & get_curr_ne()
const noexcept
870 return Base::get_curr_ne()->get_key();
873 Key & get_curr_ne() noexcept {
return Base::get_curr_ne()->get_key(); }
875 const Key & get_curr()
const {
return Base::get_curr()->get_key(); }
877 Key & get_curr() {
return Base::get_curr()->get_key(); }
894 template <
class Operation>
897 return Aleph::traverse(tree.getRoot(), [&op] (
Node * p)
899 return op(p->get_key());
903 template <
class Operation>
904 bool traverse(Operation && op = Operation())
906 return traverse<Operation>(op);
909 template <
class Operation>
912 return Aleph::traverse(tree.getRoot(), [&op] (
Node * p)
914 return op(p->get_key());
918 template <
class Operation>
919 bool traverse(Operation && op = Operation())
const 921 return traverse<Operation>(op);
926 # define SETTREE_ITOR(Name, Key, Cmp) \ 927 class Iterator : public DynSetTree<Key, Name, Cmp>::Iterator \ 930 Iterator() : DynSetTree<Key, Name, Cmp>::Iterator() \ 933 Iterator(DynSetTree<Key, Name, Cmp> & tree) \ 934 : DynSetTree<Key, Name, Cmp>::Iterator(tree) \ 945 template <
typename Key,
class Compare = Aleph::less<Key>>
960 template <
typename Key,
class Compare = Aleph::less<Key>>
975 template <
typename Key,
class Compare = Aleph::less<Key>>
990 template <
typename Key,
class Compare = Aleph::less<Key>>
997 class Iterator :
public DynSetTree<Key, Rand_Tree, Compare>::Iterator
1016 template <
typename Key,
class Compare = Aleph::less<Key>>
1030 template <
typename Key,
class Compare = Aleph::less<Key>>
1036 SETTREE_ITOR(
Treap_Rk, Key, Compare);
1046 template <
typename Key,
class Compare = Aleph::less<Key>>
1055 template <
typename T,
class Op,
class C>
1059 for (
auto it = c.get_it(); it.has_curr(); it.next_ne())
1060 ret.
insert(op(it.get_curr_ne()));
void for_each_inorder(Key_Op &key_op) const
Definition: tpl_dynSetTree.H:685
Definition: htlist.H:1290
size_t internal_path_length() const
Definition: tpl_dynSetTree.H:509
Definition: tpl_binNodeUtils.H:322
void for_each_preorder(Key_Op &&key_op=Key_Op()) const
Definition: tpl_dynSetTree.H:655
typename Tree< GT::Arc *, Compare >::Node Node
Definition: tpl_dynSetTree.H:72
size_t computeHeightRec(Node *root) noexcept
Definition: tpl_binNodeUtils.H:480
const Key & get_last() const
Definition: tpl_dynSetTree.H:496
DynSetTree & join(DynSetTree &t, DynSetTree &dup)
Definition: tpl_dynSetTree.H:757
size_t internal_path_length(Node *p) noexcept
Definition: tpl_binNodeUtils.H:931
bool check_bst(Node *p, Compare cmp=Compare())
Definition: tpl_binNodeUtils.H:1262
Node * find_min(Node *root) noexcept
Definition: tpl_binNodeUtils.H:1346
std::pair< int, Key * > find_position(const Key &key) const
Definition: tpl_dynSetTree.H:438
auto & COUNT(Node *p) noexcept
Definition: tpl_binNodeXt.H:66
DynSetTree(const DynSetTree &srcTree)
Instancia un conjunto dinámico copia de srcTree.
Definition: tpl_dynSetTree.H:110
Definition: tpl_dynSetTree.H:946
Key remove_pos(const size_t i)
Definition: tpl_dynSetTree.H:372
virtual ~DynSetTree()
Destructor; todos los elementos son liberados.
Definition: tpl_dynSetTree.H:168
void split_pos(const size_t pos, DynSetTree &l, DynSetTree &r)
Definition: tpl_dynSetTree.H:831
Definition: tpl_dynSetTree.H:961
Key & select(const size_t &i)
Definition: tpl_dynSetTree.H:561
DynSetTree(Compare cmp=Compare())
Instancia un conjunto dinámico.
Definition: tpl_dynSetTree.H:103
void swap(DynSetTree &dset)
Definition: tpl_dynSetTree.H:96
Node::Key_Type & KEY(Node *p) noexcept
Definition: tpl_binNode.H:318
int preOrderRec(Node *root, void(*visitFct)(Node *, int, int))
Definition: tpl_binNodeUtils.H:124
Definition: tpl_binNodeUtils.H:256
const Key & get_item() const
Retorna un elemento cualquiera del conjunto.
Definition: tpl_dynSetTree.H:524
void for_each_preorder(Key_Op &key_op) const
Definition: tpl_dynSetTree.H:644
void for_each_in_preorder(void(*visitFct)(Node *, int, int))
Definition: tpl_dynSetTree.H:532
Definition: tpl_dynSetTree.H:976
bool split_key(const Key &key, DynSetTree &l, DynSetTree &r)
Definition: tpl_dynSetTree.H:805
void split_key_dup(const Key &key, DynSetTree &l, DynSetTree &r)
Definition: tpl_dynSetTree.H:851
Definition: tpl_dynSetTree.H:991
DynSetTree & join_dup(DynSetTree &t)
Definition: tpl_dynSetTree.H:781
const Key & get_first() const
Definition: tpl_dynSetTree.H:483
const Key & max() const
Definition: tpl_dynSetTree.H:487
void for_each_inorder(Key_Op &&key_op=Key_Op()) const
Definition: tpl_dynSetTree.H:696
void destroyRec(Node *&root) noexcept
Definition: tpl_binNodeUtils.H:500
const size_t & size() const
Retorna la cardinalidad del conjunto.
Definition: tpl_dynSetTree.H:502
bool exist(const Key &key) const
Retorna true si key pertenece al conjunto dinámico.
Definition: tpl_dynSetTree.H:385
Definition: tpl_treapRk.H:1010
Definition: tpl_dynSetTree.H:61
Definition: tpl_binNodeUtils.H:191
void for_each_postorder(Key_Op &&key_op=Key_Op())
Definition: tpl_dynSetTree.H:737
Definition: tpl_dynSetTree.H:1031
Key & find(const Key &key) const
Definition: tpl_dynSetTree.H:414
void for_each_postorder(Key_Op &key_op)
Definition: tpl_dynSetTree.H:726
Node * find_max(Node *root) noexcept
Definition: tpl_binNodeUtils.H:1363
Definition: tpl_dynSetTree.H:1047
Node * copyRec(Node *root)
Definition: tpl_binNodeUtils.H:519
const Key & min() const
Definition: tpl_dynSetTree.H:474
Key * search_or_insert(const Key &key)
Definition: tpl_dynSetTree.H:254
Key del(const Key &key)
Definition: tpl_dynSetTree.H:349
Definition: tpl_dynSetTree.H:1017
bool traverse(Operation &op)
Definition: tpl_dynSetTree.H:895
void empty()
Elimina todos los elementos del conjunto.
Definition: tpl_dynSetTree.H:133
long position(const Key &key) const
Definition: tpl_dynSetTree.H:550
size_t height() const
Calcula y retorna la altura del árbol binario de búsqueda.
Definition: tpl_dynSetTree.H:527
DynSetTree & join(DynSetTree &t, DynSetTree &&dup=DynSetTree())
Definition: tpl_dynSetTree.H:764
bool is_empty() const
Retorna true si el conjunto está vacÃo.
Definition: tpl_dynSetTree.H:505
Key * insert(const Key &key)
Definition: tpl_dynSetTree.H:195
Definition: htlist.H:1323
Key * search(const Key &key) const
Definition: tpl_dynSetTree.H:462