27 # ifndef TPL_BINTREEOPS_H 28 # define TPL_BINTREEOPS_H 30 # include <tpl_binNodeUtils.H> 31 # include <tpl_binNodeXt.H> 40 template <
class Node,
class Cmp = Aleph::less<
typename Node::key_type>>
55 using Key =
typename Node::key_type;
69 Node *
search(Node * root,
const Key & key) noexcept
83 Node *
search_parent(Node * root,
const Key & key, Node *& parent) noexcept
85 return Aleph::search_parent<Node, Cmp>(root, key, parent, cmp);
107 return Aleph::search_rank_parent<Node, Cmp>(root, key, cmp);
120 Node *
insert(Node *& root, Node * p) noexcept
122 if (root == Node::NullPtr)
125 if (cmp(
KEY(p),
KEY(root)))
127 else if (cmp(
KEY(root),
KEY(p)))
130 return Node::NullPtr;
145 if (root == Node::NullPtr)
148 if (cmp(
KEY(p),
KEY(root)))
167 if (r == Node::NullPtr)
172 else if (cmp (
KEY(r),
KEY(p)))
180 bool __split_key_rec(Node * root,
const Key & key, Node *& ts, Node *& tg)
183 if (root == Node::NullPtr)
185 ts = tg = Node::NullPtr;
189 if (cmp(key,
KEY(root)) )
190 if (__split_key_rec(
LLINK(root), key, ts,
LLINK(root)))
198 if (cmp(
KEY(root), key) )
199 if (__split_key_rec(
RLINK(root), key,
RLINK(root), tg))
228 bool ret = __split_key_rec(root, key, ts, tg);
230 root = Node::NullPtr;
236 void __split_key_dup_rec(Node * root,
const typename Node::key_type & key,
237 Node *& ts, Node *& tg) noexcept
239 if (root == Node::NullPtr)
241 ts = tg = Node::NullPtr;
245 if (cmp(key,
KEY(root)))
246 __split_key_dup_rec(
LLINK(root), key, ts,
LLINK(root));
247 else if (cmp(
KEY(root), key))
248 __split_key_dup_rec(
RLINK(root), key,
RLINK(root), tg);
250 __split_key_dup_rec(
LLINK(root), key, ts,
LLINK(root));
267 Node *& ts, Node *& tg) noexcept
269 __split_key_dup_rec(root, key, ts, tg);
270 root = Node::NullPtr;
280 Node *
remove(Node *& root,
const Key & key) noexcept
282 if (root == Node::NullPtr)
283 return Node::NullPtr;
285 if (cmp(key,
KEY(root)))
286 return remove(
LLINK(root), key);
287 else if (cmp(
KEY(root), key))
288 return remove(
RLINK(root), key);
290 Node * ret_val = root;
311 Node * l = Node::NullPtr, * r = Node::NullPtr;
314 return Node::NullPtr;
349 if (t2 == Node::NullPtr)
352 Node * l =
LLINK(t2);
353 Node * r =
RLINK(t2);
355 if (
insert(t1, t2) == Node::NullPtr)
375 Node *
join(Node * t1, Node * t2, Node *& dup) noexcept
377 if (t1 == Node::NullPtr)
380 if (t2 == Node::NullPtr)
383 Node * l =
LLINK(t1);
384 Node * r =
RLINK(t1);
390 Node * p =
remove(t1,
KEY(t1));
392 assert(p != Node::NullPtr);
414 void split_key(Node * root,
const Key & key, Node *& l, Node *& r) noexcept
416 if (root == Node::NullPtr)
418 l = r = Node::NullPtr;
422 Node ** current_parent =
nullptr;
423 Node ** pending_child =
nullptr;
424 char current_is_right;
425 if (cmp (key,
KEY(root)))
429 current_is_right =
true;
435 current_is_right =
false;
438 Node * current = root;
439 while (current != Node::NullPtr)
441 if (cmp (key,
KEY(current)))
443 if (not current_is_right)
445 current_is_right = not current_is_right;
446 *pending_child = *current_parent;
447 pending_child = current_parent;
450 current_parent = &
LLINK(current);
454 if (current_is_right)
456 current_is_right = not current_is_right;
457 *pending_child = *current_parent;
458 pending_child = current_parent;
460 current_parent = &
RLINK(current);
463 current = *current_parent;
466 *pending_child = Node::NullPtr;
467 root = Node::NullPtr;
482 if (root == Node::NullPtr)
485 if (cmp(
KEY(p),
KEY(root)))
488 if (left_branch == Node::NullPtr)
489 return Node::NullPtr;
491 LLINK(root) = left_branch;
494 else if (cmp(
KEY(root),
KEY(p)))
497 if (right_branch == Node::NullPtr)
498 return Node::NullPtr;
500 RLINK(root) = right_branch;
504 return Node::NullPtr;
518 if (root == Node::NullPtr)
521 if (cmp(
KEY(p),
KEY(root)))
524 if (left_branch == p)
526 LLINK(root) = left_branch;
534 else if (cmp(
KEY(root),
KEY(p)))
537 if (right_branch == p)
539 RLINK(root) = right_branch;
558 template <
class Node,
559 class Cmp = Aleph::less<typename Node::key_type>>
564 using Key =
typename Node::key_type;
585 assert(
COUNT(Node::NullPtr) == 0);
587 if (r == Node::NullPtr)
590 if (this->cmp(key,
KEY(r)))
592 else if (this->cmp(
KEY(r), key))
631 assert(
COUNT(Node::NullPtr) == 0);
633 Node * parent =
nullptr;
636 while (r != Node::NullPtr)
637 if (this->cmp(key,
KEY(r)))
643 else if (this->cmp(
KEY(r), key))
675 if (root == Node::NullPtr)
677 l = r = Node::NullPtr;
681 if (this->cmp(key,
KEY(root)))
689 else if (this->cmp(
KEY(root), key))
717 if (root == Node::NullPtr)
719 l = r = Node::NullPtr;
723 if (this->cmp(key,
KEY(root)))
753 if (root == Node::NullPtr)
757 return Node::NullPtr;
778 if (root == Node::NullPtr)
791 # endif // TPL_BINTREEOPS_H Node * insert_root(Node *&root, Node *p) noexcept
Definition: tpl_binTreeOps.H:309
Cmp & get_compare() noexcept
Definition: tpl_binTreeOps.H:53
Node * rotate_to_right(Node *p) noexcept
Definition: tpl_binNodeUtils.H:1891
Node * search(Node *root, const Key &key) noexcept
Definition: tpl_binTreeOps.H:69
bool split_key_rec(Node *root, const Key &key, Node *&l, Node *&r) noexcept
Definition: tpl_binTreeOps.H:672
Node * insert(Node *&root, Node *p) noexcept
Definition: tpl_binTreeOps.H:120
auto & COUNT(Node *p) noexcept
Definition: tpl_binNodeXt.H:66
Node * insert_dup(Node *&root, Node *p) noexcept
Definition: tpl_binTreeOps.H:143
Node * search_rank_parent(Node *root, const Key &key) noexcept
Definition: tpl_binTreeOps.H:105
Node * insert_dup_root(Node *&root, Node *p) noexcept
Definition: tpl_binTreeOps.H:330
Node * insert_root(Node *&root, Node *p) noexcept
Definition: tpl_binTreeOps.H:751
Definition: tpl_binTreeOps.H:560
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
Node * join(Node *t1, Node *t2, Node *&dup) noexcept
Definition: tpl_binTreeOps.H:375
BinTree_Operation(Cmp __cmp=Cmp()) noexcept
The type of key.
Definition: tpl_binTreeOps.H:60
Node * search_or_insert_root_rec(Node *root, Node *p) noexcept
Definition: tpl_binTreeOps.H:516
void split_key(Node *root, const Key &key, Node *&l, Node *&r) noexcept
Definition: tpl_binTreeOps.H:414
long inorder_position(Node *r, const typename Node::key_type &key, Node *&p, Compare &cmp) noexcept
Definition: tpl_binNodeXt.H:210
Node *& LLINK(Node *p) noexcept
Definition: tpl_binNode.H:298
Node * insert_root_rec(Node *root, Node *p) noexcept
Definition: tpl_binTreeOps.H:480
Node * search_or_insert(Node *&r, Node *p) noexcept
Definition: tpl_binTreeOps.H:165
Node * join_preorder(Node *t1, Node *t2, Node *&dup) noexcept
Definition: tpl_binTreeOps.H:347
BinTreeXt_Operation(Cmp cmp=Cmp()) noexcept
Initialize the functor with comparison criteria cmp
Definition: tpl_binTreeOps.H:567
long inorder_position(Node *r, const Key &key, Node *&p) noexcept
Definition: tpl_binTreeOps.H:583
long find_position(Node *r, const Key &key, Node *&p) noexcept
Definition: tpl_binTreeOps.H:629
void split_key_dup_rec(Node *root, const typename Node::key_type &key, Node *&ts, Node *&tg) noexcept
Definition: tpl_binTreeOps.H:266
Node * rotate_to_left(Node *p) noexcept
Definition: tpl_binNodeUtils.H:1932
Node * join_exclusive(Node *&ts, Node *&tg) noexcept
Definition: tpl_binNodeUtils.H:1708
Cmp & key_comp() noexcept
Return the comarison criteria.
Definition: tpl_binTreeOps.H:50
Node *& RLINK(Node *p) noexcept
Definition: tpl_binNode.H:307
bool split_key_rec(Node *&root, const Key &key, Node *&ts, Node *&tg) noexcept
Definition: tpl_binTreeOps.H:225
void split_key_dup_rec(Node *root, const Key &key, Node *&l, Node *&r) noexcept
Definition: tpl_binTreeOps.H:714
typename Node::key_type key_type
The type of key.
Definition: tpl_binTreeOps.H:57
Definition: tpl_binTreeOps.H:41
Node * search_parent(Node *root, const Key &key, Node *&parent) noexcept
Definition: tpl_binTreeOps.H:83
Node * insert_dup_root(Node *&root, Node *p) noexcept
Definition: tpl_binTreeOps.H:776