28 # ifndef TPL_BINNODEUTILS_H 29 # define TPL_BINNODEUTILS_H 31 # include <ahFunction.H> 32 # include <tpl_arrayStack.H> 33 # include <tpl_arrayQueue.H> 34 # include <tpl_dynListQueue.H> 35 # include <bitArray.H> 36 # include <tpl_dynDlist.H> 37 # include <tpl_binNode.H> 39 using namespace Aleph;
42 template <
class Node>
inline static 43 void __inorder_rec(Node * node,
const int& level,
int & position,
44 void (*visitFct)(Node *,
int,
int))
46 if (node == Node::NullPtr)
49 __inorder_rec(
LLINK(node), level + 1, position, visitFct);
51 (*visitFct)(node, level, position);
54 __inorder_rec(
RLINK(node), level + 1, position, visitFct);
79 template <
class Node>
inline 80 int inOrderRec(Node * root,
void (*visitFct)(Node*,
int,
int))
83 __inorder_rec(root, 0, position, visitFct);
87 template <
class Node>
inline static 88 void __preorder_rec (Node * p,
const int & level,
int & position,
89 void (*visitFct)(Node*,
int,
int))
91 if (p == Node::NullPtr)
94 (*visitFct)(p, level, position);
97 __preorder_rec(
LLINK(p), level + 1, position, visitFct);
98 __preorder_rec(
RLINK(p), level + 1, position, visitFct);
123 template <
class Node>
inline 127 __preorder_rec(root, 0, position, visitFct);
131 template <
class Node>
inline static 132 void __postorder_rec(Node * node,
const int & level,
int & position,
133 void (*visitFct)(Node*,
int,
int))
135 if (node == Node::NullPtr)
138 __postorder_rec(
LLINK(node), level + 1, position, visitFct);
139 __postorder_rec(
RLINK(node), level + 1, position, visitFct);
141 (*visitFct)(node, level, position);
167 template <
class Node>
inline 171 __postorder_rec(root, 0, position, visitFct);
190 template <
class Node>
194 static void for_each_inorder(Node * root, Op & op) noexcept(noexcept(op))
196 if (root == Node::NullPtr)
199 for_each_inorder(
LLINK(root), op);
201 for_each_inorder(
RLINK(root), op);
208 void traverse(Node * root, Op & op)
const noexcept(noexcept(op))
210 for_each_inorder<Op>(root, op);
215 void operator () (Node * root, Op & op)
const noexcept(noexcept(op))
217 for_each_inorder<Op>(root, op);
222 void operator () (Node * root, Op && op)
const noexcept(noexcept(op))
224 for_each_inorder<Op>(root, op);
234 template <
class Node,
class Op>
inline 255 template <
class Node>
259 static void preorder(Node * root, Op & op) noexcept(noexcept(op))
261 if (root == Node::NullPtr)
265 preorder(
LLINK(root), op);
266 preorder(
RLINK(root), op);
273 void traverse(Node * root, Op & op)
const noexcept(noexcept(op))
275 return preorder(root, op);
280 void operator () (Node * root, Op & op)
const noexcept(noexcept(op))
282 preorder<Op>(root, op);
287 void operator () (Node * root, Op && op = Op()) const noexcept(noexcept(op))
289 preorder<Op>(root, op);
299 template <
class Node,
class Op>
321 template <
class Node>
325 static void postorder(Node * root, Op & op) noexcept(noexcept(op))
327 if (root == Node::NullPtr)
330 postorder(
LLINK(root), op);
331 postorder(
RLINK(root), op);
339 void traverse(Node * root, Op & op)
const noexcept(noexcept(op))
341 return postorder(root, op);
346 void operator () (Node * root, Op & op)
const noexcept(noexcept(op))
348 postorder<Op>(root, op);
353 void operator () (Node * root, Op && op = Op()) const noexcept(noexcept(op))
355 postorder<Op>(root, op);
365 template <
class Node,
class Op>
372 template <
class Node>
375 if (root == Node::NullPtr)
383 template <
class Node>
386 if (root == Node::NullPtr)
394 template <
class Node>
397 if (root == Node::NullPtr)
400 sufffix(
LLINK(root), acc);
401 siffix(
RLINK(root), acc);
412 template <
class Node>
427 template <
class Node>
431 infix(root, ret_val);
442 template <
class Node>
457 template <
class Node>
inline 460 if (root == Node::NullPtr)
468 template <
class Node>
inline 469 size_t size(Node * root) noexcept
482 if (root == Node::NullPtr)
488 return 1 + std::max(left_height, right_height);
499 template <
class Node>
inline 502 if (root == Node::NullPtr)
508 root = Node::NullPtr;
518 template <
class Node>
inline 521 if (root == Node::NullPtr)
522 return Node::NullPtr;
524 Node * tgt_root =
new Node(*root);
533 assert(
RLINK(tgt_root) == Node::NullPtr);
535 if (
LLINK(tgt_root) != Node::NullPtr)
556 template <
class Node>
inline 557 bool areSimilar(Node * t1, Node * t2) noexcept
563 if (t1 == Node::NullPtr or t2 == Node::NullPtr)
581 template <
class Node,
class Equal>
inline 582 bool areEquivalents(Node * t1, Node * t2, Equal & op) noexcept
587 if (t1 == Node::NullPtr or t2 == Node::NullPtr)
590 if (not op(
KEY(t1),
KEY(t2)))
593 return (areEquivalents(
LLINK(t1),
LLINK(t2), op) and
598 template <
class Node,
class Equal = std::equal_to<
typename Node::key_type>>
599 inline bool areEquivalents(Node * t1, Node * t2, Equal && op = Equal()) noexcept
601 return areEquivalents(t1, t2, op);
621 template <
class Node>
inline 622 void levelOrder(Node * root,
void (*visitFct)(Node*,
int,
bool))
624 if (root == Node::NullPtr)
628 queue.
put(std::pair<Node*, bool>(root,
bool()));
630 for (
int pos = 0; not queue.
is_empty(); pos++)
632 std::pair<Node*, bool> pr = queue.
get();
633 Node *& p = pr.first;
635 (*visitFct) (p, pos, pr.second);
637 if (
LLINK(p) != Node::NullPtr)
638 queue.
put(std::pair <Node*, bool> (
LLINK(p),
true));
640 if (
RLINK(p) != Node::NullPtr)
641 queue.
put(std::pair <Node*, bool> (
RLINK(p),
false));
661 template <
class Node,
class Operation>
inline 664 if (root == Node::NullPtr)
671 Node * p = queue.
get();
672 if (not operation(p))
675 if (
LLINK(p) != Node::NullPtr)
678 if (
RLINK(p) != Node::NullPtr)
684 template <
class Node,
class Operation>
inline 687 return level_traverse<Node, Operation>(root, operation);
705 template <
template <
class>
class Node,
typename Key>
inline 712 return Node<Key>::NullPtr;
715 assert(r_p - l_p == r_i - l_i);
717 Node<Key> * root =
new Node<Key>(preorder[l_p]);
724 for (
int j = l_i; j <= r_i; ++j)
725 if (inorder[j] == preorder[l_p])
733 LLINK(root) = build_tree<Node, Key>(preorder, l_p + 1, l_p + i,
734 inorder, l_i, l_i + (i - 1));
735 RLINK(root) = build_tree<Node, Key>(preorder, l_p + i + 1, r_p,
736 inorder, l_i + i + 1, r_i);
740 template <
template <
class>
class Node,
typename Key>
inline 741 Node<Key> * build_postorder(
const DynArray<Key> & post,
long lp,
long rp,
744 assert(rp - lp == ri - li);
746 return Node<Key>::NullPtr;
748 Node<Key> * root =
new Node<Key>(post[rp]);
752 if (in[i] == post[rp])
757 LLINK(root) = build_postorder<Node, Key>(post, lp, lp + (i - li) - 1,
759 RLINK(root) = build_postorder<Node, Key>(post, rp - (ri - i), rp - 1,
764 template <
class Node>
inline static void 765 __compute_nodes_in_level(Node * root,
long level,
long current_level,
768 if (root == Node::NullPtr)
771 if (current_level == level)
777 __compute_nodes_in_level(
LLINK(root), level, current_level + 1, level_list);
778 __compute_nodes_in_level(
RLINK(root), level, current_level + 1, level_list);
789 template <
class Node>
inline 793 __compute_nodes_in_level(root, level, 0, list);
818 template <
class Node>
inline 821 if (root == Node::NullPtr)
824 Node *p = root, *r = Node::NullPtr, *q;
825 while (p != Node::NullPtr)
828 if (q == Node::NullPtr)
837 while (q != r and
RLINK(q) != Node::NullPtr)
849 RLINK(q) = Node::NullPtr;
876 template <
class Node>
inline 879 if (node == Node::NullPtr)
882 Node * p = node, * r = Node::NullPtr, *q;
883 while (p != Node::NullPtr)
887 if (q == Node::NullPtr)
896 while (q != r and
RLINK(q) != Node::NullPtr)
907 RLINK(q) = Node::NullPtr;
913 template <
class Node>
inline static 914 size_t __internal_path_length(Node * p,
const size_t & level) noexcept
916 if (p == Node::NullPtr)
919 return level + __internal_path_length(
LLINK(p), level + 1) +
920 __internal_path_length(
RLINK(p), level + 1);
930 template <
class Node>
inline 933 return __internal_path_length(p, 0);
949 template <
class Node>
inline 952 if (root == Node::NullPtr)
976 template <
class Node>
inline 991 template <
class Node>
inline string code(Node * root)
994 const size_t n = bits.
size();
995 string str(
""); str.reserve(n);
996 for (
size_t i = 0; i < n; ++i)
997 str.push_back(bits(i) ?
'b' :
'a');
1002 template <
class Node>
static inline 1003 Node * __bits_to_tree(
const BitArray & array,
int & i)
1007 return Node::NullPtr;
1009 Node * p =
new Node;
1010 LLINK(p) = __bits_to_tree<Node>(array, i);
1011 RLINK(p) = __bits_to_tree<Node>(array, i);
1029 template <
class Node>
inline 1032 return __bits_to_tree <Node>(array, idx);
1052 template <
class Node>
inline 1055 if (root == Node::NullPtr)
1058 output << root->get_key() <<
" ";
1073 template <
class Node>
inline 1076 if (root == Node::NullPtr)
1079 input >> root->get_key();
1100 template <
class Node>
inline 1105 prefix.
save(output);
1121 template <
class Node>
inline 1126 Node * root = bits_to_tree <Node> (
prefix);
1132 template <
class Node,
class Get_Key>
inline 1133 void put_tree_keys_in_array(Node * root, ostream & out)
1135 if (root == Node::NullPtr)
1138 const string str = Get_Key () (root);
1142 else if (str ==
"\n")
1145 out <<
"\"" << str <<
"\"";
1148 put_tree_keys_in_array<Node, Get_Key>(
LLINK(root), out);
1149 put_tree_keys_in_array<Node, Get_Key>(
RLINK(root), out);
1153 template <
class Node,
class Load_Key>
inline 1154 void load_tree_keys_from_array(Node * root,
const char * keys[],
int & idx)
1156 if (root == Node::NullPtr)
1159 if (Load_Key()(root, keys[idx]))
1162 load_tree_keys_from_array<Node, Load_Key>(
LLINK(root), keys, idx);
1163 load_tree_keys_from_array<Node, Load_Key>(
RLINK(root), keys, idx);
1194 template <
class Node,
class Get_Key>
inline 1196 const string & array_name,
1202 output <<
"const char * " << array_name <<
"_k[] = { " << endl;
1203 put_tree_keys_in_array <Node, Get_Key> (root, output);
1204 output <<
"nullptr };" << endl;
1237 template <
class Node,
class Load_Key>
inline 1239 const size_t & num_bits,
1240 const char * keys[])
1244 Node * root = bits_to_tree <Node> (
prefix);
1246 load_tree_keys_from_array <Node, Load_Key> (root, keys, i);
1260 template <
class Node,
1261 class Compare = Aleph::less<typename Node::key_type>>
inline 1264 if (p == Node::NullPtr)
1267 if (
LLINK(p) != Node::NullPtr and
1268 (not less_or_equal_than(
KEY(
LLINK(p)),
KEY(p), cmp) or
1272 if (
RLINK(p) != Node::NullPtr and
1273 (not less_or_equal_than(
KEY(p),
KEY(
RLINK(p)), cmp) or
1291 template <
class Node>
inline Node *
1295 return Node::NullPtr;
1297 Node * root =
new Node(preorder[l]);
1302 int first_greater = l + 1;
1303 while ((first_greater <= r) and (preorder[first_greater] < preorder[l]))
1306 LLINK(root) = preorder_to_bst<Node>(preorder, l + 1, first_greater - 1);
1307 RLINK(root) = preorder_to_bst<Node>(preorder, first_greater, r);
1321 template <
class Node,
1322 class Compare = Aleph::less<typename Node::key_type>>
inline 1324 Compare cmp = Compare()) noexcept
1326 while (root != Node::NullPtr)
1327 if (cmp(key,
KEY(root)))
1329 else if(cmp(
KEY(root), key))
1345 template <
class Node>
inline 1348 while (
LLINK(root) != Node::NullPtr)
1362 template <
class Node>
inline 1365 while (
RLINK(root) != Node::NullPtr)
1379 template <
class Node>
inline 1382 assert(p != Node::NullPtr);
1383 assert(
RLINK(p) != Node::NullPtr);
1387 while (
LLINK(p) != Node::NullPtr)
1404 template <
class Node>
inline 1407 assert(p != Node::NullPtr);
1408 assert(
LLINK(pp) != Node::NullPtr);
1413 while (
RLINK(p) != Node::NullPtr)
1434 template <
class Node,
1435 class Compare = Aleph::less<typename Node::key_type>>
inline 1437 Node *& parent, Compare cmp = Compare()) noexcept
1439 assert((
LLINK(parent) == root) or (
RLINK(parent) == root));
1440 assert(root != Node::NullPtr);
1443 if (cmp(key,
KEY(root)))
1445 if (
LLINK(root) == Node::NullPtr)
1451 else if (cmp(
KEY(root), key))
1453 if (
RLINK(root) == Node::NullPtr)
1481 template <
class Node,
1482 class Compare = Aleph::less<typename Node::key_type>>
1485 Compare cmp = Compare()) noexcept
1487 assert(root != Node::NullPtr);
1490 if (cmp(key,
KEY(root)))
1492 if (
LLINK(root) == Node::NullPtr)
1497 else if (cmp(
KEY(root), key))
1499 if (
RLINK(root) == Node::NullPtr)
1520 template <
class Node,
1521 class Compare = Aleph::less<typename Node::key_type>>
inline 1524 if (r == Node::NullPtr)
1528 return insert_in_bst<Node,Compare>(
LLINK(r), p, cmp);
1529 else if (cmp(
KEY(r),
KEY(p)))
1530 return insert_in_bst<Node,Compare>(
RLINK(r), p, cmp);
1532 return Node::NullPtr;
1547 template <
class Node,
1548 class Compare = Aleph::less<typename Node::key_type>>
inline 1552 if (root == Node::NullPtr)
1555 if (cmp(
KEY(p),
KEY(root)))
1575 template <
class Node,
1576 class Compare = Aleph::less<typename Node::key_type>>
inline 1580 if (r == Node::NullPtr)
1584 return search_or_insert_in_bst<Node, Compare>(
LLINK(r), p, cmp);
1585 else if (cmp(
KEY(r),
KEY(p)))
1586 return search_or_insert_in_bst<Node, Compare>(
RLINK(r), p, cmp);
1592 template <
class Node,
class Compare>
static inline 1593 bool __split_key_rec(Node * root,
const typename Node::key_type & key,
1594 Node *& ts, Node *& tg, Compare & cmp) noexcept
1596 if (root == Node::NullPtr)
1598 ts = tg = Node::NullPtr;
1602 if (cmp(key,
KEY(root)))
1603 if (__split_key_rec(
LLINK(root), key, ts,
LLINK(root), cmp))
1611 if (cmp(
KEY(root), key))
1612 if (__split_key_rec(
RLINK(root), key,
RLINK(root), tg, cmp))
1641 template <
class Node,
1642 class Compare = Aleph::less<typename Node::key_type>>
inline 1644 Node *& ts, Node *& tg, Compare cmp = Compare()) noexcept
1646 bool ret = __split_key_rec(root, key, ts, tg, cmp);
1648 root = Node::NullPtr;
1653 template <
class Node,
class Compare>
static inline 1654 void __split_key_dup_rec(Node * root,
const typename Node::key_type & key,
1655 Node *& ts, Node *& tg, Compare & cmp) noexcept
1657 if (root == Node::NullPtr)
1659 ts = tg = Node::NullPtr;
1663 if (cmp(
KEY(root), key))
1664 __split_key_dup_rec(
RLINK(root), key,
RLINK(root), tg, cmp);
1666 __split_key_dup_rec(
LLINK(root), key, ts,
LLINK(root), cmp);
1684 template <
class Node,
1685 class Compare = Aleph::less<typename Node::key_type>>
inline 1687 Node *& ts, Node *& tg, Compare cmp = Compare()) noexcept
1689 __split_key_dup_rec(root, key, ts, tg, cmp);
1690 root = Node::NullPtr;
1707 template <
class Node>
inline 1710 if (ts == Node::NullPtr)
1713 if (tg == Node::NullPtr)
1719 Node * ret_val = ts;
1720 ts = tg = Node::NullPtr;
1736 template <
class Node,
1737 class Compare = Aleph::less<typename Node::key_type>>
inline 1739 Compare cmp = Compare()) noexcept
1741 if (root == Node::NullPtr)
1742 return Node::NullPtr;
1744 if (cmp(key,
KEY(root)))
1746 else if (cmp(
KEY(root), key))
1749 Node * ret_val = root;
1771 template <
class Node,
1772 class Compare = Aleph::less<typename Node::key_type>>
inline 1773 Node *
insert_root(Node *& root, Node * p, Compare cmp = Compare()) noexcept
1775 Node * l = Node::NullPtr, * r = Node::NullPtr;
1778 return Node::NullPtr;
1797 template <
class Node,
1798 class Compare = Aleph::less<typename Node::key_type>>
inline 1819 template <
class Node,
1820 class Compare = Aleph::less<typename Node::key_type>>
inline 1821 Node *
join_preorder(Node * t1, Node * t2, Node *& dup, Compare cmp = Compare())
1824 if (t2 == Node::NullPtr)
1827 Node * l =
LLINK(t2);
1828 Node * r =
RLINK(t2);
1853 template <
class Node,
1854 class Compare = Aleph::less<typename Node::key_type>>
inline 1855 Node *
join(Node * t1, Node * t2, Node *& dup, Compare cmp = Compare()) noexcept
1857 if (t1 == Node::NullPtr)
1860 if (t2 == Node::NullPtr)
1863 Node * l =
LLINK(t1);
1864 Node * r =
RLINK(t1);
1868 while (t1 != Node::NullPtr and
insert_root(t2, t1, cmp) == Node::NullPtr)
1874 assert(p != Node::NullPtr);
1890 template <
class Node>
inline 1893 assert(p != Node::NullPtr);
1895 Node * q =
LLINK(p);
1907 template <
class Node>
inline 1910 assert(p != Node::NullPtr);
1911 assert(pp != Node::NullPtr);
1914 Node * q =
LLINK(p);
1931 template <
class Node>
inline 1934 assert(p != Node::NullPtr);
1948 template <
class Node>
inline 1951 assert(p != Node::NullPtr);
1952 assert(pp != Node::NullPtr);
1982 template <
class Node,
class Key,
1983 class Compare = Aleph::less<typename Node::key_type>>
inline 1984 void split_key(Node *& root,
const Key & key, Node *& l, Node *& r,
1985 Compare cmp = Compare()) noexcept
1987 assert(l == Node::NullPtr and r == Node::NullPtr);
1988 if (root == Node::NullPtr)
1990 l = r = Node::NullPtr;
1994 Node ** current_parent =
nullptr;
1995 Node ** pending_child =
nullptr;
1996 char current_is_right =
true;
1997 if (cmp(key,
KEY(root)))
2006 current_is_right =
false;
2009 Node * current = root;
2010 while (current != Node::NullPtr)
2012 if (cmp (key,
KEY(current)))
2014 if (not current_is_right)
2016 current_is_right = not current_is_right;
2017 *pending_child = *current_parent;
2018 pending_child = current_parent;
2020 current_parent = &
LLINK(current);
2024 if (current_is_right)
2026 current_is_right = not current_is_right;
2027 *pending_child = *current_parent;
2028 pending_child = current_parent;
2030 current_parent = &
RLINK(current);
2032 current = *current_parent;
2034 *pending_child = Node::NullPtr;
2035 root = Node::NullPtr;
2047 template <
class Node>
inline 2054 assert(p != Node::NullPtr and q != Node::NullPtr and
2055 pp != Node::NullPtr and pq != Node::NullPtr);
2058 assert(
LLINK(q) == Node::NullPtr);
2067 LLINK(p) = Node::NullPtr;
2083 Node *qr =
RLINK(q);
2100 template <
class Node>
inline 2107 assert((p != Node::NullPtr) and (q != Node::NullPtr) and
2108 (pp != Node::NullPtr) and (pq != Node::NullPtr));
2109 assert((
RLINK(pp) == p) or (
LLINK(pp) == p));
2110 assert((
RLINK(pq) == q) or (
LLINK(pq) == q));
2111 assert(
RLINK(q) == Node::NullPtr);
2120 RLINK(p) = Node::NullPtr;
2136 Node *ql =
LLINK(q);
2156 template <
class Node,
class Key,
2157 class Compare = Aleph::less<typename Node::key_type>>
inline 2160 if (root == Node::NullPtr)
2163 if (cmp(
KEY(p),
KEY(root)))
2166 if (left_branch == Node::NullPtr)
2167 return Node::NullPtr;
2169 LLINK(root) = left_branch;
2172 else if (cmp(
KEY(root),
KEY(p)))
2175 if (right_branch == Node::NullPtr)
2176 return Node::NullPtr;
2178 RLINK(root) = right_branch;
2182 return Node::NullPtr;
2195 template <
class Node,
class Key,
2196 class Compare = Aleph::less<typename Node::key_type> >
inline 2200 if (root == Node::NullPtr)
2203 if (cmp(
KEY(p),
KEY(root)))
2206 if (left_branch == p)
2208 LLINK(root) = left_branch;
2215 else if (cmp(
KEY(root),
KEY(p)))
2218 if (right_branch == p)
2220 RLINK(root) = right_branch;
2225 return right_branch;
2239 template <
class Node>
2242 Node * root =
nullptr;
2243 Node * curr = Node::NullPtr;
2251 std::swap(root, it.root);
2252 std::swap(curr, it.curr);
2261 : root(__root), curr(root), s(Node::MaxHeight)
2267 : root(it.root), curr(it.curr), s(it.s)
2287 static Node * last(Node * p) noexcept
2289 if (
RLINK(p) != Node::NullPtr)
2290 return last(
RLINK(p));
2292 if (
LLINK(p) != Node::NullPtr)
2293 return last(
LLINK(p));
2310 curr = Node::NullPtr;
2332 bool has_curr() const noexcept {
return curr != Node::NullPtr; }
2341 throw std::overflow_error(
"Iterator overflow");
2342 return get_curr_ne();
2350 if (l != Node::NullPtr)
2353 if (r != Node::NullPtr)
2358 if (r != Node::NullPtr)
2365 curr = Node::NullPtr;
2374 throw std::overflow_error(
"Iterator overflow");
2401 template <
class Node,
class Op>
2405 if (not op(it.get_curr_ne()))
2429 template <
class Node,
class Op>
2430 void prefix_for_each(Node * root, Op op) noexcept(noexcept(op))
2433 op(it.get_curr_ne());
2444 template <
class Node>
2447 mutable Node * root = Node::NullPtr;
2448 Node * curr = Node::NullPtr;
2452 Node * advance_to_min(Node * r) noexcept
2454 while (
LLINK(r) != Node::NullPtr)
2462 static Node * advance_to_max(Node * r) noexcept
2464 while (
RLINK(r) != Node::NullPtr)
2470 void init() noexcept
2472 if (root != Node::NullPtr)
2473 curr = advance_to_min(root);
2481 std::swap(root, it.root);
2482 std::swap(curr, it.curr);
2483 std::swap(pos, it.pos);
2491 : root(__root), s(Node::MaxHeight)
2497 : root(it.root), curr(it.curr), pos(it.pos), s(it.s)
2515 curr = advance_to_max(root);
2522 curr = Node::NullPtr;
2545 bool has_curr() const noexcept {
return curr != Node::NullPtr; }
2547 bool is_last()
const noexcept
2549 return curr !=
nullptr and
RLINK(curr) ==
nullptr and s.
is_empty();
2559 throw std::overflow_error(
"Iterator overflow");
2566 void next_ne() noexcept
2570 if (curr != Node::NullPtr)
2572 curr = advance_to_min(curr);
2577 curr = Node::NullPtr;
2587 throw std::overflow_error(
"Iterator overflow");
2614 template <
class Node,
class Op>
2618 if (not op(it.get_curr_ne()))
2627 template <
class Node,
class Op>
2628 bool traverse(Node * root, Op op) noexcept(noexcept(op))
2651 template <
class Node,
class Op>
2652 void infix_for_each(Node * root, Op op) noexcept(noexcept(op))
2655 op(it.get_curr_ne());
2660 # endif // TPL_BINNODEUTILS_H bool is_empty() const noexcept
Retrun true if stack is empty.
Definition: tpl_arrayStack.H:225
DynDlist< Node * > compute_nodes_in_level(Node *root, const int &level)
Definition: tpl_binNodeUtils.H:790
Definition: tpl_binNodeUtils.H:2445
Node * get_curr_ne() const noexcept
Return the current link guaranteeing no exception. Be careful.
Definition: tpl_binNodeUtils.H:2553
int read_bit(const size_t i) const
Definition: bitArray.H:280
void end() noexcept
Put the iterator in end state.
Definition: tpl_binNodeUtils.H:2308
Node * get_curr_ne() const noexcept
Return the current link guaranteeing no exception. Be careful.
Definition: tpl_binNodeUtils.H:2335
void swap_node_with_successor(Node *p, Node *&pp, Node *q, Node *&pq) noexcept
Definition: tpl_binNodeUtils.H:2048
DynList< Node * > infix(Node *root)
Definition: tpl_binNodeUtils.H:428
size_t compute_cardinality_rec(Node *root) noexcept
Definition: tpl_binNodeUtils.H:458
Definition: tpl_binNodeUtils.H:322
void split_key(Node *&root, const Key &key, Node *&l, Node *&r, Compare cmp=Compare()) noexcept
Definition: tpl_binNodeUtils.H:1984
size_t computeHeightRec(Node *root) noexcept
Definition: tpl_binNodeUtils.H:480
Node * insert_root(Node *&root, Node *p, Compare cmp=Compare()) noexcept
Definition: tpl_binNodeUtils.H:1773
void for_each_in_order(Node *root, Op &&op) noexcept(noexcept(op))
Definition: tpl_binNodeUtils.H:235
BinNodeInfixIterator(Node *__root) noexcept
Initialize an iterator on the first node inorder sense.
Definition: tpl_binNodeUtils.H:2490
void preOrderThreaded(Node *node, void(*visitFct)(Node *))
Definition: tpl_binNodeUtils.H:877
DynList< Node * > suffix(Node *root)
Definition: tpl_binNodeUtils.H:443
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
void reset_last() noexcept
Reset the iterator to the first node inorder sense.
Definition: tpl_binNodeUtils.H:2512
Node * find_min(Node *root) noexcept
Definition: tpl_binNodeUtils.H:1346
Definition: bitArray.H:135
bool is_empty() const noexcept
rioReturn true if this is empty
Definition: tpl_dynListQueue.H:112
Definition: tpl_dynDlist.H:51
Definition: tpl_arrayStack.H:64
BinNodePrefixIterator(Node *__root) noexcept
Definition: tpl_binNodeUtils.H:2260
Node * rotate_to_left(Node *p, Node *pp) noexcept
Definition: tpl_binNodeUtils.H:1949
void save_tree(Node *root, ostream &output)
Definition: tpl_binNodeUtils.H:1101
void levelOrder(Node *root, void(*visitFct)(Node *, int, bool))
Definition: tpl_binNodeUtils.H:622
size_t size() const noexcept
Retorna la dimensión del arreglo de bits.
Definition: bitArray.H:241
Node * find_predecessor(Node *p, Node *&pp) noexcept
Definition: tpl_binNodeUtils.H:1405
bool split_key_rec(Node *&root, const typename Node::key_type &key, Node *&ts, Node *&tg, Compare cmp=Compare()) noexcept
Definition: tpl_binNodeUtils.H:1643
Definition: tpl_binNodeUtils.H:2240
Node * search_or_insert_root_rec(Node *root, Node *p, Compare cmp=Compare()) noexcept
Definition: tpl_binNodeUtils.H:2197
void next_ne() noexcept
Definition: tpl_binNodeUtils.H:2347
Definition: tpl_dynListQueue.H:50
void next()
Definition: tpl_binNodeUtils.H:2584
Node * join_preorder(Node *t1, Node *t2, Node *&dup, Compare cmp=Compare()) noexcept
Definition: tpl_binNodeUtils.H:1821
Node * search_or_insert_in_bst(Node *&r, Node *p, Compare cmp=Compare()) noexcept
Definition: tpl_binNodeUtils.H:1577
T & push(const T &data)
Definition: tpl_arrayStack.H:118
Node * searchInBinTree(Node *root, const typename Node::key_type &key, Compare cmp=Compare()) noexcept
Definition: tpl_binNodeUtils.H:1323
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
bool has_curr() const noexcept
Return true the iterator has current node.
Definition: tpl_binNodeUtils.H:2545
void load(std::istream &input)
Definition: bitArray.H:471
void load_tree_keys_in_prefix(Node *root, istream &input)
Definition: tpl_binNodeUtils.H:1074
void traverse(Node *root, Op &op) const noexcept(noexcept(op))
Invoke to traversal from root node.
Definition: tpl_binNodeUtils.H:208
Node * get_curr() const
Return a pointer to current node.
Definition: tpl_binNodeUtils.H:2338
void push(const unsigned int value)
Inserta al final del arreglo el valor value.
Definition: bitArray.H:347
void swap_node_with_predecessor(Node *p, Node *&pp, Node *q, Node *&pq) noexcept
Definition: tpl_binNodeUtils.H:2101
Node * insert_dup_in_bst(Node *&root, Node *p, Compare cmp=Compare()) noexcept
Definition: tpl_binNodeUtils.H:1549
void load_from_array_of_chars(const unsigned char str[], const size_t num_bits)
Definition: bitArray.H:545
Node *& LLINK(Node *p) noexcept
Definition: tpl_binNode.H:298
void swap(BinNodePrefixIterator &it)
Swap thiswith it
Definition: tpl_binNodeUtils.H:2249
void empty() noexcept
Empty the stack.
Definition: tpl_arrayStack.H:222
void save_tree_in_array_of_chars(Node *root, const string &array_name, ostream &output)
Definition: tpl_binNodeUtils.H:1195
int postOrderRec(Node *root, void(*visitFct)(Node *, int, int))
Definition: tpl_binNodeUtils.H:168
void destroyRec(Node *&root) noexcept
Definition: tpl_binNodeUtils.H:500
bool level_traverse(Node *root, Operation &operation)
Definition: tpl_binNodeUtils.H:662
void save(std::ostream &output)
Definition: bitArray.H:443
void reset_last() noexcept
Reset the iterator to the last node in preorder.
Definition: tpl_binNodeUtils.H:2301
void operator()(Node *root, Op &op) const noexcept(noexcept(op))
Definition: tpl_binNodeUtils.H:215
Node * join(Node *t1, Node *t2, Node *&dup, Compare cmp=Compare()) noexcept
Definition: tpl_binNodeUtils.H:1855
void traverse(Node *root, Op &op) const noexcept(noexcept(op))
Invoke the traversal.
Definition: tpl_binNodeUtils.H:273
Definition: tpl_binNodeUtils.H:191
void save_tree_keys_in_prefix(Node *root, ostream &output)
Definition: tpl_binNodeUtils.H:1053
void save_in_array_of_chars(const string &name, std::ostream &output)
Definition: bitArray.H:508
BitArray tree_to_bits(Node *root)
Definition: tpl_binNodeUtils.H:977
Node * find_successor(Node *p, Node *&pp) noexcept
Definition: tpl_binNodeUtils.H:1380
Node * load_tree(istream &input)
Definition: tpl_binNodeUtils.H:1122
Node< Key > * build_tree(const DynArray< Key > &preorder, long l_p, long r_p, const DynArray< Key > &inorder, long l_i, long r_i)
Definition: tpl_binNodeUtils.H:706
void for_each_preorder(Node *root, Op &&op)
Definition: tpl_binNodeUtils.H:300
Node * find_max(Node *root) noexcept
Definition: tpl_binNodeUtils.H:1363
T pop()
Definition: tpl_arrayStack.H:167
Node * search_parent(Node *root, const typename Node::key_type &key, Node *&parent, Compare cmp=Compare()) noexcept
Definition: tpl_binNodeUtils.H:1436
void next()
Move the iterator one position forward.
Definition: tpl_binNodeUtils.H:2371
Node * rotate_to_right(Node *p, Node *pp) noexcept
Definition: tpl_binNodeUtils.H:1908
Node * insert_dup_root(Node *&root, Node *p, Compare cmp=Compare()) noexcept
Definition: tpl_binNodeUtils.H:1799
bool has_curr() const noexcept
Return true if iterator has current node.
Definition: tpl_binNodeUtils.H:2332
void traverse(Node *root, Op &op) const noexcept(noexcept(op))
Invoke the traversal.
Definition: tpl_binNodeUtils.H:339
Node * load_tree_from_array(const unsigned char bits[], const size_t &num_bits, const char *keys[])
Definition: tpl_binNodeUtils.H:1238
Node * join_exclusive(Node *&ts, Node *&tg) noexcept
Definition: tpl_binNodeUtils.H:1708
Node * preorder_to_bst(DynArray< typename Node::key_type > &preorder, int l, int r)
Definition: tpl_binNodeUtils.H:1292
Node * insert_in_bst(Node *&r, Node *p, Compare cmp=Compare()) noexcept
Definition: tpl_binNodeUtils.H:1522
void split_key_dup_rec(Node *&root, const typename Node::key_type &key, Node *&ts, Node *&tg, Compare cmp=Compare()) noexcept
Definition: tpl_binNodeUtils.H:1686
size_t get_pos() const
Return the current position of iterator. Only valid if has_curr() == true.
Definition: tpl_binNodeUtils.H:2564
Node * copyRec(Node *root)
Definition: tpl_binNodeUtils.H:519
void for_each_postorder(Node *root, Op &&op)
Definition: tpl_binNodeUtils.H:366
bool infix_traverse(Node *root, Op op) noexcept(noexcept(op))
Definition: tpl_binNodeUtils.H:2615
Node * insert_root_rec(Node *root, Node *p, Compare cmp=Compare()) noexcept
Definition: tpl_binNodeUtils.H:2158
T & append(const T &item)
Definition: htlist.H:1471
T get()
Definition: tpl_dynListQueue.H:165
Node * search_rank_parent(Node *root, const typename Node::key_type &key, Compare cmp=Compare()) noexcept
Definition: tpl_binNodeUtils.H:1484
DynList< Node * > prefix(Node *root)
Definition: tpl_binNodeUtils.H:413
Node *& RLINK(Node *p) noexcept
Definition: tpl_binNode.H:307
Node * bits_to_tree(const BitArray &array, int idx=0)
Definition: tpl_binNodeUtils.H:1030
void reset_first() noexcept
Reset the iterator to the first node in preorder sense.
Definition: tpl_binNodeUtils.H:2278
bool prefix_traverse(Node *root, Op op) noexcept(noexcept(op))
Definition: tpl_binNodeUtils.H:2402
Node * get_curr() const
Return the current node. Throw overflow_error if there is no current.
Definition: tpl_binNodeUtils.H:2556
Node * remove_from_bst(Node *&root, const typename Node::key_type &key, Compare cmp=Compare()) noexcept
Definition: tpl_binNodeUtils.H:1738
T & put(const T &data)
The type of element.
Definition: tpl_dynListQueue.H:125
T & append(const T &item)
Definition: tpl_dynDlist.H:149
int inOrderRec(Node *root, void(*visitFct)(Node *, int, int))
Definition: tpl_binNodeUtils.H:80
void inOrderThreaded(Node *root, void(*visitFct)(Node *))
Definition: tpl_binNodeUtils.H:819
void swap(ArrayStack &s) noexcept
Swap this with s
Definition: tpl_arrayStack.H:100
void reset_first() noexcept
Reset the iterator to the first node inorder sense.
Definition: tpl_binNodeUtils.H:2505