38#include <gtest/gtest.h>
59template <
typename NodeT>
62 std::vector<int>
keys;
63 if (
root == NodeT::NullPtr)
67 keys.insert(
keys.end(), left.begin(), left.end());
70 keys.insert(
keys.end(), right.begin(), right.end());
89 auto *p =
new Node(key);
110 EXPECT_EQ(tree.getRoot(), Node::NullPtr);
140 auto *p = pool.make(10);
141 auto *inserted = tree.
insert(p);
155 for (
int k : {5, 3, 7, 1, 4, 6, 8})
170 auto *p1 = pool.make(10);
171 auto *p2 = pool.make(10);
186 for (
int i = 0; i < 5; ++i)
187 ASSERT_NE(tree.insert_dup(pool.make(10)),
nullptr);
198 for (
int k = 1;
k <= 100; ++
k)
215 for (
int k = 100;
k >= 1; --
k)
236 for (
int k : {1, 2, 3, 4, 5})
239 for (
int k : {1, 2, 3, 4, 5})
252 for (
int k : {1, 3, 5})
266 auto *p1 = pool.make(10);
269 auto *p2 = pool.make(10);
270 auto *found = tree.search_or_insert(p2);
284 tree.
insert(pool.make(5));
286 auto *p = pool.make(10);
287 auto *result = tree.search_or_insert(p);
303 for (
int k : {1, 2, 3, 4, 5})
326 tree.
insert(pool.make(1));
327 tree.
insert(pool.make(3));
338 auto *
root = pool.make(5);
340 tree.
insert(pool.make(3));
341 tree.
insert(pool.make(7));
358 for (
int k : {5, 3, 7, 1, 4, 6, 8})
361 for (
int k : {5, 3, 7, 1, 4, 6, 8})
378 for (
int k = 1;
k <= 10; ++
k)
381 for (
int k = 1;
k <= 10; ++
k)
398 for (
int k = 1;
k <= 10; ++
k)
401 for (
int k = 10;
k >= 1; --
k)
422 for (
int k : {5, 3, 7, 1, 4, 6, 8})
440 tree.
insert(pool.make(1));
441 tree.
insert(pool.make(2));
452 for (
int k : {5, 3, 7, 1, 4, 6, 8})
474 for (
int k : {2, 4, 6})
477 auto [pos, node] = tree.position(3);
486 for (
int k : {2, 4, 6, 8})
489 auto [pos, node] = tree.find_position(4);
499 for (
int k : {2, 4, 6, 8})
503 auto [pos, node] = tree.find_position(5);
514 for (
int k : {2, 4, 6})
517 auto [pos, node] = tree.find_position(1);
527 for (
int k : {2, 4, 6})
530 auto [pos, node] = tree.find_position(10);
544 for (
int k : {5, 3, 7, 1, 4, 6, 8})
549 auto *
removed = tree.remove_pos(3);
564 for (
int k : {5, 3, 7})
568 auto *
removed = tree.remove_pos(0);
582 for (
int k : {5, 3, 7})
586 auto *
removed = tree.remove_pos(2);
610 for (
int k : {2, 4, 6, 8, 10})
613 bool result = tree.split_key(5,
t1,
t2);
632 for (
int k : {2, 4, 6, 8, 10})
635 bool result = tree.split_key(6,
t1,
t2);
646 for (
int k : {2, 4, 6, 8, 10})
649 tree.split_key_dup(6,
t1,
t2);
666 for (
int k : {1, 2, 3, 4, 5})
669 tree.split_pos(2,
t1,
t2);
691 for (
int k : {1, 3, 5})
692 tree1.insert(pool.make(
k));
693 for (
int k : {2, 4, 6})
694 tree2.insert(pool.make(
k));
714 for (
int k : {1, 3, 5})
715 tree1.insert(pool.make(
k));
716 for (
int k : {3, 4, 5})
717 tree2.insert(pool.make(
k));
739 for (
int k : {1, 3, 5})
740 tree1.insert(pool.make(
k));
741 for (
int k : {3, 4, 5})
742 tree2.insert(pool.make(
k));
758 for (
int k : {1, 2, 3})
759 tree1.insert(pool.make(
k));
761 for (
int k : {10, 11, 12})
762 tree2.insert(pool.make(
k));
783 for (
int k : {5, 3, 7, 1, 4, 6, 8})
786 std::vector<int> result;
787 for (Tree::Iterator it(tree); it.has_curr(); it.next())
788 result.push_back(
KEY(it.get_curr()));
790 EXPECT_EQ(result, (std::vector<int>{1, 3, 4, 5, 6, 7, 8}));
796 Tree::Iterator it(tree);
806 for (
int k : {1, 2, 3, 4, 5})
813 std::vector<int> result;
814 for (Tree::Iterator it(tree); it.has_curr(); it.next())
815 result.push_back(
KEY(it.get_curr()));
817 EXPECT_EQ(result, (std::vector<int>{1, 2, 4, 5}));
830 for (
int k : {1, 2, 3})
831 tree1.insert(pool.make(
k));
832 for (
int k : {10, 20})
833 tree2.insert(pool.make(
k));
855 for (
int k : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
879 using NodeGt = TreeGt::Node;
883 std::vector<NodeGt *>
nodes;
884 for (
int k : {1, 2, 3, 4, 5})
895 std::vector<int> result;
896 for (TreeGt::Iterator it(tree); it.has_curr(); it.next())
897 result.push_back(
KEY(it.get_curr()));
899 EXPECT_EQ(result, (std::vector<int>{5, 4, 3, 2, 1}));
902 for (
int k : {1, 2, 3, 4, 5})
903 delete tree.remove(
k);
915 for (
int k : {-5, -3, -1, 0, 1, 3, 5})
935 auto *p = pool.make(42);
941 auto [pos, node] = tree.position(42);
963 std::mt19937
rng(12345);
964 std::uniform_int_distribution<int> dist(0, 999);
967 for (
int i = 0; i < 500; ++i)
981 for (
int i = 0; i < 200; ++i)
992 for (
int i = 0; i < 200; ++i)
1025 for (
int k = 0;
k <
N; ++
k)
1028 EXPECT_EQ(tree.size(),
static_cast<size_t>(
N));
1032 for (
int i = 0; i < 10; ++i)
1036 for (
int k = 0;
k <
N;
k += 2)
1044 EXPECT_EQ(tree.size(),
static_cast<size_t>(
N / 2));
1048 for (
int k = 1;
k <
N;
k += 2)
1059 using NodeVtl = TreeVtl::Node;
1063 for (
int k : {1, 2, 3, 4, 5})
1070 for (
int k : {1, 2, 3, 4, 5})
1071 delete tree.remove(
k);
1085 for (
int k : {5, 3, 7, 1, 4, 6, 8})
1107 tree.
insert(pool.make(10));
1116 auto &
cmp1 = tree.key_comp();
1117 auto &
cmp2 = tree.get_compare();
1130 auto *
rng = tree.gsl_rng_object();
1141 tree1.set_seed(999);
1142 tree2.set_seed(999);
1144 for (
int k : {1, 2, 3, 4, 5})
1159static_assert(!std::is_copy_assignable_v<Tree>,
1160 "Rand_Tree should not be copy assignable");
1162static_assert(!std::is_copy_constructible_v<Tree>,
1163 "Rand_Tree should not be copy constructible");
WeightedDigraph::Node Node
Minimal std::expected-style result type for C++20.
std::vector< Node * > nodes
Node for QuadTree spatial data structure.
QuadTree - Hierarchical spatial index for 2D points.
void remove(const Point &p)
Remove a point from the tree.
Point * search(const Point &p) noexcept
Search for a point in the tree.
Point * insert(Node *&r, const Point &p)
Recursive insert helper.
Generator for uniformly random trees.
__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)
DynArray< Graph::Node * > nodes
size_t blossom_maximum_cardinality_matching(const GT &g, DynDlist< typename GT::Arc * > &matching, SA sa=SA())
Alias of compute_maximum_cardinality_general_matching().
Main namespace for Aleph-w library functions.
std::vector< int > inorder_keys(NodeT *root)
Randomized binary search tree.
Randomized binary search tree.
Utility functions for binary tree operations.
Randomized binary search tree.