44#include <gtest/gtest.h>
50using namespace testing;
58 std::vector<Node *> allocated;
62 auto * p =
new Node(
k);
63 allocated.push_back(p);
68 for (
auto & q : allocated)
78 for (
auto * p : allocated)
85 if (
root == Node::NullPtr)
94 std::vector<int> keys;
103 if (
root != Node::NullPtr)
110 if (
root != Node::NullPtr)
116 bool operator()(
int a,
int b)
const noexcept {
return a > b; }
124 for (
int k : {1, 2, 4, 5})
127 Node *
l = Node::NullPtr;
128 Node * r = Node::NullPtr;
142 for (
const int k : {1, 2, 3, 4, 5})
145 Node *
l = Node::NullPtr;
146 Node * r = Node::NullPtr;
157 for (
const int k : {1, 2, 2, 3, 4})
160 Node *
l = Node::NullPtr;
161 Node * r = Node::NullPtr;
175 for (
const int k : {2, 1, 3})
178 auto * p = pool.make(4);
184 auto * dup = pool.make(2);
194 for (
const int k : {1, 2, 3})
197 auto * p = pool.make(2);
208 for (
const int k : {1, 2, 3, 4, 5})
211 auto *
p0 = pool.make(99);
218 auto expected = std::vector<int>{99, 1, 2, 3, 4, 5};
219 auto * p3 = pool.make(77);
226 auto *
bad = pool.make(123);
235 for (
const int k : {1, 2, 3})
238 auto * p = pool.make(0);
247 auto * q = pool.make(2);
262 for (
const int k : {1, 2, 3, 4, 5})
269 Node * p = Node::NullPtr;
287 for (
int k : {1, 2, 3})
294 Node *
ts = Node::NullPtr;
295 Node *
tg = Node::NullPtr;
309 for (
const int k : {5, 3, 7, 2, 4, 6, 8})
326 auto * dup = pool.make(2);
350 auto * p = pool.make(10);
355 auto * q = pool.make(10);
367 for (
const int k : {5, 3, 7, 2, 4, 6, 8})
379 Node * parent = Node::NullPtr;
390 for (
const int k : {5, 3, 7, 2, 4, 6, 8})
408 for (
const int k : {2, 4, 6, 8})
411 Node * p = Node::NullPtr;
434 for (
const int k : {1, 2, 3, 4, 5, 6, 7})
437 Node *
l = Node::NullPtr;
438 Node * r = Node::NullPtr;
459 for (
const int k : {1, 2, 3, 4, 5, 6, 7})
485 auto * p = pool.make(2);
486 LLINK(p) = pool.make(1);
487 RLINK(p) = pool.make(3);
507 std::mt19937
rng(12345);
508 std::uniform_int_distribution<int> dist(0, 400);
512 for (
int i = 0; i < 300; ++i)
515 auto * p = pool.make(
k);
517 if (
ins == Node::NullPtr)
530 for (
int i = 0; i < 200; ++i)
WeightedDigraph::Node Node
Node for extended binary search tree.
T & insert(const T &item)
Insert a new item by copy.
iterator end() noexcept
Return an STL-compatible end iterator.
iterator begin() noexcept
Return an STL-compatible iterator to the first element.
__gmp_expr< T, __gmp_binary_expr< __gmp_expr< T, U >, unsigned long int, __gmp_root_function > > root(const __gmp_expr< T, U > &expr, unsigned long int l)
int cmp(const __gmp_expr< T, U > &expr1, const __gmp_expr< V, W > &expr2)
void delete_tree(Tree_Node< T > *node)
long inorder_position(Node *r, const typename Node::key_type &key, Node *&p, Compare &cmp) noexcept
Compute the inorder position of a key.
Node * insert_dup_by_key_xt(Node *&r, Node *p, Compare &cmp) noexcept
Insert a node in an extended binary search tree without testing for duplicity.
Node * insert_dup_root_xt(Node *&root, Node *p, Compare &cmp) noexcept
Insert a node as root of an extended binary search tree.
Node * insert_by_key_xt(Node *&r, Node *p, Compare &cmp) noexcept
Insert a node in an extended binary search tree.
bool check_rank_tree(Node *root) noexcept
Return true if root is a valid extended binary tree.
void split_pos_rec(Node *&r, const size_t i, Node *&ts, Node *&tg)
Split a extended binary tree according to a position.
constexpr Node *& RLINK(Node *p) noexcept
Return the right tree of p.
auto & COUNT(Node *p) noexcept
Return the number of nodes of the tree fron p is root.
Node * remove_by_pos_xt(Node *&root, size_t pos)
Remove from a extended binary tree the node whose inorder position is pos.
Node * remove_by_key_xt(Node *&root, const typename Node::key_type &key, Compare &cmp) noexcept
Remove a key of extended binary tree.
Node * insert_root_xt(Node *&root, Node *p, Compare &cmp) noexcept
Insert a node p as root of an extended binary search tree.
Node * rotate_to_left_xt(Node *p) noexcept
Rotate to left the extended binary tree with root p.
bool split_key_rec_xt(Node *&root, const typename Node::key_type &key, Node *&l, Node *&r, Compare &cmp) noexcept
Split an extended binary search tree according to a key.
Node * select(Node *r, const size_t pos)
Iterative selection of a node according to inorder position.
Node * select_ne(Node *r, const size_t pos) noexcept
Iterative selection of a node according to inorder position without exception.
constexpr Node *& LLINK(Node *p) noexcept
Return a pointer to left subtree.
Node * rotate_to_right_xt(Node *p) noexcept
Rotate to right the extended bianry tree with root p
void split_key_dup_rec_xt(Node *&root, const typename Node::key_type &key, Node *&l, Node *&r, Compare &cmp) noexcept
Split an extended binary search tree according to a key which can be in the tree.
void insert_by_pos_xt(Node *&r, Node *p, size_t pos)
Insert a node in a specific inorder position in a binary tree.
Node * select_rec(Node *r, const size_t i)
Recursively select the i-th node inorder sense.
Node * join_exclusive_xt(Node *&ts, Node *&tg) noexcept
Exclusive union of two extended binary search trees.
Main namespace for Aleph-w library functions.
size_t size(Node *root) noexcept
long find_position(Node *r, const typename Node::key_type &key, Node *&p, Compare &cmp) noexcept
Find the inorder position of a key in an extended binary search tree.
Node * search_or_insert_by_key_xt(Node *&r, Node *p, Compare &cmp) noexcept
Search or insert a node in an extended binary search tree.
DynList< T > maps(const C &c, Op op)
Classic map operation.
std::vector< int > inorder_keys(NodeT *root)
Utility functions for binary tree operations.
Extended binary node with subtree count.