38#include <gtest/gtest.h>
58template <
typename NodeT>
61 std::vector<int>
keys;
62 if (
root == NodeT::NullPtr)
66 keys.insert(
keys.end(), left.begin(), left.end());
69 keys.insert(
keys.end(), right.begin(), right.end());
88 auto *p =
new Node(key);
109 EXPECT_EQ(tree.getRoot(), Node::NullPtr);
139 auto *p = pool.make(10);
140 auto *inserted = tree.
insert(p);
154 for (
int k : {5, 3, 7, 1, 4, 6, 8})
169 auto *p1 = pool.make(10);
170 auto *p2 = pool.make(10);
185 for (
int i = 0; i < 5; ++i)
186 ASSERT_NE(tree.insert_dup(pool.make(10)),
nullptr);
197 for (
int k = 1;
k <= 100; ++
k)
214 for (
int k = 100;
k >= 1; --
k)
235 for (
int k : {1, 2, 3, 4, 5})
238 for (
int k : {1, 2, 3, 4, 5})
251 for (
int k : {1, 3, 5})
265 auto *p1 = pool.make(10);
268 auto *p2 = pool.make(10);
269 auto *found = tree.search_or_insert(p2);
283 tree.
insert(pool.make(5));
285 auto *p = pool.make(10);
286 auto *result = tree.search_or_insert(p);
302 for (
int k : {1, 2, 3, 4, 5})
325 tree.
insert(pool.make(1));
326 tree.
insert(pool.make(3));
337 auto *
root = pool.make(5);
339 tree.
insert(pool.make(3));
340 tree.
insert(pool.make(7));
357 for (
int k : {5, 3, 7, 1, 4, 6, 8})
360 for (
int k : {5, 3, 7, 1, 4, 6, 8})
377 for (
int k = 1;
k <= 10; ++
k)
380 for (
int k = 1;
k <= 10; ++
k)
397 for (
int k = 1;
k <= 10; ++
k)
400 for (
int k = 10;
k >= 1; --
k)
421 for (
int k : {5, 3, 7, 1, 4, 6, 8})
439 tree.
insert(pool.make(1));
440 tree.
insert(pool.make(2));
451 for (
int k : {5, 3, 7, 1, 4, 6, 8})
473 for (
int k : {2, 4, 6})
476 auto [pos, node] = tree.position(3);
485 for (
int k : {2, 4, 6, 8})
488 auto [pos, node] = tree.find_position(4);
498 for (
int k : {2, 4, 6, 8})
502 auto [pos, node] = tree.find_position(5);
513 for (
int k : {2, 4, 6})
516 auto [pos, node] = tree.find_position(1);
526 for (
int k : {2, 4, 6})
529 auto [pos, node] = tree.find_position(10);
543 for (
int k : {5, 3, 7, 1, 4, 6, 8})
548 auto *
removed = tree.remove_pos(3);
563 for (
int k : {5, 3, 7})
567 auto *
removed = tree.remove_pos(0);
581 for (
int k : {5, 3, 7})
585 auto *
removed = tree.remove_pos(2);
609 for (
int k : {2, 4, 6, 8, 10})
612 bool result = tree.split_key(5,
t1,
t2);
631 for (
int k : {2, 4, 6, 8, 10})
634 bool result = tree.split_key(6,
t1,
t2);
645 for (
int k : {2, 4, 6, 8, 10})
648 tree.split_key_dup(6,
t1,
t2);
665 for (
int k : {1, 2, 3, 4, 5})
668 tree.split_pos(2,
t1,
t2);
690 for (
int k : {1, 3, 5})
691 tree1.insert(pool.make(
k));
692 for (
int k : {2, 4, 6})
693 tree2.insert(pool.make(
k));
713 for (
int k : {1, 3, 5})
714 tree1.insert(pool.make(
k));
715 for (
int k : {3, 4, 5})
716 tree2.insert(pool.make(
k));
738 for (
int k : {1, 3, 5})
739 tree1.insert(pool.make(
k));
740 for (
int k : {3, 4, 5})
741 tree2.insert(pool.make(
k));
757 for (
int k : {1, 2, 3})
758 tree1.insert(pool.make(
k));
760 for (
int k : {10, 11, 12})
761 tree2.insert(pool.make(
k));
782 for (
int k : {5, 3, 7, 1, 4, 6, 8})
785 std::vector<int> result;
786 for (Tree::Iterator it(tree); it.has_curr(); it.next())
787 result.push_back(
KEY(it.get_curr()));
789 EXPECT_EQ(result, (std::vector<int>{1, 3, 4, 5, 6, 7, 8}));
795 Tree::Iterator it(tree);
805 for (
int k : {1, 2, 3, 4, 5})
812 std::vector<int> result;
813 for (Tree::Iterator it(tree); it.has_curr(); it.next())
814 result.push_back(
KEY(it.get_curr()));
816 EXPECT_EQ(result, (std::vector<int>{1, 2, 4, 5}));
829 for (
int k : {1, 2, 3})
830 tree1.insert(pool.make(
k));
831 for (
int k : {10, 20})
832 tree2.insert(pool.make(
k));
854 for (
int k : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
878 using NodeGt = TreeGt::Node;
882 std::vector<NodeGt *>
nodes;
883 for (
int k : {1, 2, 3, 4, 5})
894 std::vector<int> result;
895 for (TreeGt::Iterator it(tree); it.has_curr(); it.next())
896 result.push_back(
KEY(it.get_curr()));
898 EXPECT_EQ(result, (std::vector<int>{5, 4, 3, 2, 1}));
901 for (
int k : {1, 2, 3, 4, 5})
902 delete tree.remove(
k);
914 for (
int k : {-5, -3, -1, 0, 1, 3, 5})
934 auto *p = pool.make(42);
940 auto [pos, node] = tree.position(42);
962 std::mt19937
rng(12345);
963 std::uniform_int_distribution<int> dist(0, 999);
966 for (
int i = 0; i < 500; ++i)
980 for (
int i = 0; i < 200; ++i)
991 for (
int i = 0; i < 200; ++i)
1024 for (
int k = 0;
k <
N; ++
k)
1027 EXPECT_EQ(tree.size(),
static_cast<size_t>(
N));
1031 for (
int i = 0; i < 10; ++i)
1035 for (
int k = 0;
k <
N;
k += 2)
1043 EXPECT_EQ(tree.size(),
static_cast<size_t>(
N / 2));
1047 for (
int k = 1;
k <
N;
k += 2)
1058 using NodeVtl = TreeVtl::Node;
1062 for (
int k : {1, 2, 3, 4, 5})
1069 for (
int k : {1, 2, 3, 4, 5})
1070 delete tree.remove(
k);
1084 for (
int k : {5, 3, 7, 1, 4, 6, 8})
1106 tree.
insert(pool.make(10));
1115 auto &
cmp1 = tree.key_comp();
1116 auto &
cmp2 = tree.get_compare();
1129 auto *
rng = tree.gsl_rng_object();
1140 tree1.set_seed(999);
1141 tree2.set_seed(999);
1143 for (
int k : {1, 2, 3, 4, 5})
1158static_assert(!std::is_copy_assignable_v<Tree>,
1159 "Rand_Tree should not be copy assignable");
1161static_assert(!std::is_copy_constructible_v<Tree>,
1162 "Rand_Tree should not be copy constructible");
WeightedDigraph::Node Node
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
Main namespace for Aleph-w library functions.
Divide_Conquer_DP_Result< Cost > divide_and_conquer_partition_dp(const size_t groups, const size_t n, Transition_Cost_Fn transition_cost, const Cost inf=dp_optimization_detail::default_inf< Cost >())
Optimize partition DP using divide-and-conquer optimization.
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.