45#include <gtest/gtest.h>
52using namespace testing;
64 std::vector<Node *> allocated;
68 auto * p =
new Node(
k);
69 allocated.push_back(p);
75 for (
auto & q : allocated)
85 for (
const auto * p : allocated)
92 std::vector<HybridNode *> allocated;
97 allocated.push_back(p);
103 for (
auto & q : allocated)
113 for (
const auto * p : allocated)
120 std::vector<int>
keys;
121 if (
root == Node::NullPtr)
125 keys.insert(
keys.end(), left.begin(), left.end());
128 keys.insert(
keys.end(), right.begin(), right.end());
134 if (
root == Node::NullPtr)
141 ASSERT_TRUE(tree.verify()) <<
"Red-black tree invariant violated";
147 return tree.getRoot() == Node::NullPtr;
150 template <
typename NodeT>
153 if (
root == NodeT::NullPtr)
158 template <
typename NodeT>
161 std::vector<int>
keys;
162 if (
root == NodeT::NullPtr)
166 keys.insert(
keys.end(), left.begin(), left.end());
169 keys.insert(
keys.end(), right.begin(), right.end());
175 ASSERT_TRUE(tree.verify()) <<
"HtdRbTree red-black invariant violated";
188 EXPECT_EQ(tree.getRoot(), Node::NullPtr);
198 auto * p = pool.make(42);
199 auto * inserted = tree.
insert(p);
202 EXPECT_NE(tree.getRoot(), Node::NullPtr);
204 EXPECT_EQ(count_nodes(tree.getRoot()), 1u);
213 for (
int k : {5, 3, 7, 1, 4, 6, 8})
215 auto * p = pool.make(
k);
219 EXPECT_EQ(count_nodes(tree.getRoot()), 7u);
231 auto * p1 = pool.make(10);
234 auto * p2 = pool.make(10);
237 EXPECT_EQ(count_nodes(tree.getRoot()), 1u);
261 auto * dup = pool.make(5);
262 EXPECT_EQ(tree.
insert(dup),
nullptr) <<
"Should reject duplicate at intermediate level";
263 EXPECT_EQ(count_nodes(tree.getRoot()), 3u);
283 auto * dup = pool.make(10);
284 EXPECT_EQ(tree.
insert(dup),
nullptr) <<
"Should reject duplicate after left descents";
285 EXPECT_EQ(count_nodes(tree.getRoot()), 3u);
296 for (
int k : {50, 25, 75, 10, 30, 60, 80, 5, 15, 27, 35})
301 EXPECT_EQ(tree.
insert(pool.make(25)),
nullptr) <<
"Duplicate at level 1";
302 EXPECT_EQ(tree.
insert(pool.make(10)),
nullptr) <<
"Duplicate at level 2";
303 EXPECT_EQ(tree.
insert(pool.make(5)),
nullptr) <<
"Duplicate at deepest level";
304 EXPECT_EQ(tree.
insert(pool.make(35)),
nullptr) <<
"Duplicate after mixed descent";
306 EXPECT_EQ(count_nodes(tree.getRoot()), 11u);
315 for (
int i = 0; i < 5; ++i)
316 ASSERT_NE(tree.insert_dup(pool.make(42)),
nullptr);
318 EXPECT_EQ(count_nodes(tree.getRoot()), 5u);
330 for (
int k : {1, 2, 3, 4, 5})
333 for (
int k : {1, 2, 3, 4, 5})
348 for (
int k : {1, 3, 5})
365 auto * p1 = pool.make(10);
366 auto *
ret1 = tree.search_or_insert(p1);
368 EXPECT_EQ(count_nodes(tree.getRoot()), 1u);
371 auto * p2 = pool.make(10);
372 auto *
ret2 = tree.search_or_insert(p2);
375 EXPECT_EQ(count_nodes(tree.getRoot()), 1u);
389 for (
int k : {1, 2, 3, 4, 5})
398 EXPECT_EQ(count_nodes(tree.getRoot()), 4u);
411 for (
int k : {1, 3, 5})
416 EXPECT_EQ(count_nodes(tree.getRoot()), 3u);
434 tree.
insert(pool.make(5));
435 tree.
insert(pool.make(3));
436 tree.
insert(pool.make(7));
444 EXPECT_EQ(count_nodes(tree.getRoot()), 2u);
453 std::vector<int>
keys = {5, 3, 7, 1, 4, 6, 8};
474 for (
int k = 1;
k <= 10; ++
k)
477 for (
int k = 1;
k <= 10; ++
k)
494 for (
int k = 1;
k <= 10; ++
k)
497 for (
int k = 10;
k >= 1; --
k)
514 constexpr int key = 7;
515 for (
int i = 0; i < 4; ++i)
516 ASSERT_NE(tree.insert_dup(pool.make(key)),
nullptr);
518 for (
int remaining = 4; remaining > 0; --remaining)
527 static_cast<size_t>(remaining - 1));
544 tree.
insert(pool.make(5));
547 tree.
insert(pool.make(3));
548 tree.
insert(pool.make(7));
549 tree.
insert(pool.make(1));
550 tree.
insert(pool.make(4));
561 for (
int k : {1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
573 std::mt19937
rng(42);
574 std::uniform_int_distribution<int> dist(0, 1000);
576 for (
int i = 0; i < 100; ++i)
578 auto * p = pool.make(dist(
rng));
595 auto * p = pool.make(42);
612 for (
int k = 10;
k >= 1; --
k)
615 EXPECT_EQ(count_nodes(tree.getRoot()), 10u);
619 EXPECT_EQ(
keys, (std::vector<int>{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}));
627 for (
int k = 1;
k <= 10; ++
k)
630 EXPECT_EQ(count_nodes(tree.getRoot()), 10u);
634 EXPECT_EQ(
keys, (std::vector<int>{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}));
644 using NodeGt = TreeGt::Node;
647 std::vector<NodeGt *>
nodes;
649 for (
int k : {1, 2, 3, 4, 5})
656 EXPECT_EQ(count_nodes(tree.getRoot()), 5u);
660 std::vector<int>
keys;
662 if (
r == NodeGt::NullPtr)
return;
671 for (
auto * p :
nodes)
685 std::mt19937
rng(42);
686 std::uniform_int_distribution<int> dist(0, 500);
689 for (
int i = 0; i < 200; ++i)
692 auto * p = pool.make(
k);
693 if (tree.
insert(p) !=
nullptr)
710 for (
int i = 0; i < 100; ++i)
726 for (
int i = 0; i < 150; ++i)
758 for (
int k = 0;
k <
N; ++
k)
761 EXPECT_EQ(count_nodes(tree.getRoot()),
static_cast<size_t>(
N));
765 for (
int k = 0;
k <
N;
k += 2)
773 EXPECT_EQ(count_nodes(tree.getRoot()),
static_cast<size_t>(
N / 2));
784 Tree::Iterator it(tree);
794 std::vector<int>
expected = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
798 std::vector<int> result;
799 for (Tree::Iterator it(tree); it.has_curr(); it.next())
800 result.push_back(
KEY(it.get_curr()));
810 for (
int k : {1, 2, 3, 4, 5})
817 std::vector<int> result;
818 for (Tree::Iterator it(tree); it.has_curr(); it.next())
819 result.push_back(
KEY(it.get_curr()));
821 EXPECT_EQ(result, (std::vector<int>{1, 2, 4, 5}));
833 for (
int k : {5, 3, 7, 1, 4, 6, 8})
850 tree.
insert(pool.make(1));
866 for (
int k = 1;
k <= 10; ++
k)
869 EXPECT_EQ(tree.size(),
static_cast<size_t>(
k));
872 for (
int k = 1;
k <= 5; ++
k)
892 tree1.insert(pool.make(2));
893 tree1.insert(pool.make(3));
895 tree2.insert(pool.make(10));
896 tree2.insert(pool.make(11));
916 auto * p1 =
new Node(1);
917 auto * p2 =
new Node(2);
918 auto * p3 =
new Node(3);
930 delete tree2.remove(1);
931 delete tree2.remove(2);
932 delete tree2.remove(3);
939 auto * p1 =
new Node(1);
940 auto * p2 =
new Node(2);
950 delete tree2.remove(1);
951 delete tree2.remove(2);
961 EXPECT_EQ(tree.getRoot(), HybridNode::NullPtr);
974 auto * p1 = pool.make(10);
978 auto * p2 = pool.make(10);
991 for (
int i = 0; i < 5; ++i)
992 ASSERT_NE(tree.insert_dup(pool.make(42)),
nullptr);
1003 HybridNodePool pool;
1005 auto * p1 = pool.make(10);
1006 auto *
ret1 = tree.search_or_insert(p1);
1010 auto * p2 = pool.make(10);
1011 auto *
ret2 = tree.search_or_insert(p2);
1023 HybridNodePool pool;
1025 for (
int k : {1, 2, 3, 4, 5})
1028 auto *
removed = tree.remove(3);
1042 HybridNodePool pool;
1044 tree.
insert(pool.make(42));
1047 auto *
removed = tree.remove(42);
1060 HybridNodePool pool;
1062 std::vector<int>
keys = {5, 3, 7, 1, 4, 6, 8};
1066 std::sort(
keys.begin(),
keys.end());
1082 HybridNodePool pool;
1084 for (
int k : {1, 3, 5})
1096 HybridNodePool pool;
1098 constexpr int key = 5;
1099 for (
int i = 0; i < 3; ++i)
1100 ASSERT_NE(tree.insert_dup(pool.make(key)),
nullptr);
1102 for (
int remaining = 3; remaining > 0; --remaining)
1110 EXPECT_EQ(tree.size(),
static_cast<size_t>(remaining - 1));
1121 HybridNodePool pool;
1123 std::vector<int>
expected = {1, 2, 3, 4, 5, 6, 7};
1124 for (
int k : {4, 2, 6, 1, 3, 5, 7})
1125 tree.insert(pool.make(
k));
1127 std::vector<int>
got;
1128 for (HybridTree::Iterator it(tree); it.has_curr(); it.next())
1129 got.push_back(
KEY(it.get_curr()));
1138 HybridTree::Iterator it(tree);
1147 HybridNodePool pool;
1149 tree1.insert(pool.make(1));
1150 tree1.insert(pool.make(2));
1151 tree1.insert(pool.make(3));
1153 tree2.insert(pool.make(10));
1154 tree2.insert(pool.make(11));
1178 bool operator()(
int a,
int b)
const {
return std::abs(a) < std::abs(b); }
1182 using NodeAbs = TreeAbs::Node;
1188 auto * found = tree.
search(-1);
1202 HybridNodePool pool;
1204 for (
int k : {-5, -3, -1, 0, 1, 3, 5})
1211 EXPECT_EQ(
keys, (std::vector<int>{-5, -3, -1, 0, 1, 3, 5}));
1221 HybridNodePool pool;
1224 std::mt19937
rng(123);
1225 std::uniform_int_distribution<int> dist(0, 500);
1228 for (
int i = 0; i < 200; ++i)
1231 auto * p = pool.make(
k);
1232 if (tree.insert(p) !=
nullptr)
1249 for (
int i = 0; i < 100; ++i)
1252 auto * found = tree.search(
k);
1263 for (
int i = 0; i < 150; ++i)
1290 HybridNodePool pool;
1292 auto * p = pool.make(42);
1293 auto * inserted = tree.insert(p);
1296 EXPECT_NE(tree.getRoot(), HybridNode::NullPtr);
1305 HybridNodePool pool;
1307 for (
int k : {5, 3, 7, 1, 4, 6, 8})
1308 ASSERT_NE(tree.insert(pool.make(
k)),
nullptr);
1320 HybridNodePool pool;
1322 for (
int k : {1, 2, 3, 4, 5})
1325 for (
int k : {1, 2, 3, 4, 5})
1327 auto * found = tree.search(
k);
1338 HybridNodePool pool;
1340 for (
int k : {1, 3, 5})
1362 HybridNodePool pool;
1364 tree.
insert(pool.make(5));
1365 tree.insert(pool.make(3));
1366 tree.insert(pool.make(7));
1368 auto *
removed = tree.remove(5);
1381 HybridNodePool pool;
1383 for (
int k = 1;
k <= 10; ++
k)
1386 for (
int k = 10;
k >= 1; --
k)
1401 HybridNodePool pool;
1403 for (
int k = 10;
k >= 1; --
k)
1410 EXPECT_EQ(
keys, (std::vector<int>{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}));
1416 HybridNodePool pool;
1418 for (
int k = 1;
k <= 10; ++
k)
1425 EXPECT_EQ(
keys, (std::vector<int>{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}));
1431 HybridNodePool pool;
1435 for (
int k = 0;
k <
N; ++
k)
1438 EXPECT_EQ(tree.size(),
static_cast<size_t>(
N));
1442 for (
int k = 0;
k <
N;
k += 2)
1450 EXPECT_EQ(tree.size(),
static_cast<size_t>(
N / 2));
1457 using NodeGt = TreeGt::Node;
1461 for (
int k : {1, 2, 3, 4, 5})
1468 std::vector<int>
keys;
1469 for (TreeGt::Iterator it(tree); it.has_curr(); it.next())
1470 keys.push_back(
KEY(it.get_curr()));
1475 for (
int k : {1, 2, 3, 4, 5})
1476 delete tree.remove(
k);
1482 HybridNodePool pool;
1484 for (
int k : {1, 2, 3, 4, 5})
1487 auto *
removed = tree.remove(3);
1491 std::vector<int> result;
1492 for (HybridTree::Iterator it(tree); it.has_curr(); it.next())
1493 result.push_back(
KEY(it.get_curr()));
1495 EXPECT_EQ(result, (std::vector<int>{1, 2, 4, 5}));
1514 delete tree2.remove(1);
1515 delete tree2.remove(2);
1516 delete tree2.remove(3);
1534 delete tree2.remove(1);
1535 delete tree2.remove(2);
1543 using NodeVtl = TreeVtl::Node;
1547 for (
int k : {1, 2, 3, 4, 5})
1557 auto * found = tree.search(3);
1562 for (
int k : {1, 2, 3, 4, 5})
1577 for (
int k : {-5, -3, -1, 0, 1, 3, 5})
1584 EXPECT_EQ(
keys, (std::vector<int>{-5, -3, -1, 0, 1, 3, 5}));
1593 using NodeGt = TreeGt::Node;
1597 for (
int k : {1, 2, 3, 4, 5})
1604 auto *
removed = tree.remove(3);
1616 for (
int k : {2, 4, 5})
1617 delete tree.remove(
k);
1630 const int N = 10000;
1631 for (
int k = 0;
k <
N; ++
k)
1638 EXPECT_EQ(tree.size(),
static_cast<size_t>(
N));
1642 for (
int k = 0;
k <
N; ++
k)
1651 const int N = 10000;
1652 for (
int k =
N - 1;
k >= 0; --
k)
1659 EXPECT_EQ(tree.size(),
static_cast<size_t>(
N));
1670 for (
int i = 0; i <
N; ++i)
1672 int k = (i % 2 == 0) ? i / 2 :
N - 1 - i / 2;
1676 EXPECT_EQ(tree.size(),
static_cast<size_t>(
N));
1686 std::mt19937
gen(98765);
1687 std::uniform_int_distribution<>
key_dist(0, 50000);
1688 std::uniform_int_distribution<>
op_dist(0, 2);
1697 auto * p = pool.make(key);
1698 if (tree.
insert(p) !=
nullptr)
1706 else if (op == 1 && !
oracle.empty())
1709 auto it =
oracle.begin();
1710 std::advance(it,
gen() %
oracle.size());
1721 auto * found = tree.
search(key);
1730 if (
iter % 2000 == 0)
1745 const int N = 10000;
1748 for (
int k = 0;
k <
N; ++
k)
1751 EXPECT_EQ(tree.size(),
static_cast<size_t>(
N));
1757 std::mt19937
gen(11111);
1778 const int DUPS = 10;
1780 for (
int k = 0;
k <
N; ++
k)
1781 for (
int d = 0; d <
DUPS; ++d)
1782 tree.insert_dup(pool.make(
k));
1788 for (
int k = 0;
k <
N; ++
k)
1789 for (
int d = 0; d <
DUPS; ++d)
1806 std::mt19937
gen(22222);
1807 std::uniform_int_distribution<>
key_dist(0, 1000);
1815 auto * p = pool.make(key);
1816 if (tree.
insert(p) !=
nullptr)
1824 else if (!
oracle.empty())
1826 auto it =
oracle.begin();
1827 std::advance(it,
gen() %
oracle.size());
1846 using StrNode = StrTree::Node;
1849 std::vector<StrNode*>
nodes;
1850 std::set<std::string>
oracle;
1852 std::mt19937
gen(33333);
1856 int len = 5 +
gen() % 20;
1857 for (
int i = 0; i < len; ++i)
1858 s +=
'a' +
gen() % 26;
1863 for (
int i = 0; i < 2000; ++i)
1868 if (tree.insert(p) !=
nullptr)
1876 for (
const auto & key :
oracle)
1880 for (
auto * p :
nodes)
1888 HybridNodePool pool;
1891 std::mt19937
gen(44444);
1892 std::uniform_int_distribution<>
key_dist(0, 10000);
1893 std::uniform_int_distribution<>
op_dist(0, 2);
1902 auto * p = pool.make(key);
1903 if (tree.insert(p) !=
nullptr)
1911 else if (op == 1 && !
oracle.empty())
1913 auto it =
oracle.begin();
1914 std::advance(it,
gen() %
oracle.size());
1925 auto * found = tree.search(key);
static string random_string(std::mt19937 &rng, size_t len)
WeightedDigraph::Node Node
Red-black binary search tree implementation (bottom-up).
Hybrid top-down/bottom-up red-black tree.
Minimal std::expected-style result type for C++20.
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.
__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().
bool check_bst(Node *p, const Compare &cmp=Compare())
Return true if p is a binary search tree.
Main namespace for Aleph-w library functions.
std::vector< int > inorder_keys(NodeT *root)
Red-black tree with virtual destructor in nodes.
Red-black tree with nodes without virtual destructor.
Hybrid top-down/bottom-up red-black tree implementation.
Red-Black tree implementation (bottom-up balancing).