43#include <gtest/gtest.h>
75 auto *node =
new Node(key);
82 std::vector<Node*>
nodes;
103 Node *node = make_node(42);
114 std::vector<int>
keys = {50, 25, 75, 10, 30, 60, 90};
117 for (
auto *node :
nodes)
141 auto nodes = make_nodes({50, 25, 75, 10, 30});
142 for (
auto *node :
nodes)
156 std::vector<int>
keys = {50, 25, 75, 10, 30, 60, 90};
159 for (
auto *node :
nodes)
163 std::vector<int>
removal = {30, 10, 90, 50, 25, 75, 60};
166 EXPECT_NE(tree.remove(key),
nullptr) <<
"Failed to remove " << key;
167 EXPECT_TRUE(tree.verify()) <<
"Verify failed after removing " << key;
180 auto nodes = make_nodes({50, 25, 75, 10, 30, 60, 90});
181 for (
auto *node :
nodes)
185 std::vector<int>
expected = {10, 25, 30, 50, 60, 75, 90};
187 for (
size_t i = 0; i <
expected.size(); ++i)
189 Node *selected = tree.select(i);
190 ASSERT_NE(selected,
nullptr) <<
"select(" << i <<
") returned null";
197 auto nodes = make_nodes({10, 20, 30, 40, 50});
198 for (
auto *node :
nodes)
207 std::vector<int>
expected = {10, 20, 40, 50};
208 for (
size_t i = 0; i <
expected.size(); ++i)
210 Node *selected = tree.select(i);
219 for (
int i = 0; i < 100; ++i)
220 tree.insert(make_node(i * 2));
226 for (
size_t i = 0; i < 100; ++i)
228 Node *selected = tree.select(i);
240 auto nodes = make_nodes({10, 20, 30, 40, 50});
241 for (
auto *node :
nodes)
258 auto nodes = make_nodes({10, 20, 30, 40, 50});
259 for (
auto *node :
nodes)
262 auto [pos, node] = tree.position(25);
269 auto nodes = make_nodes({10, 20, 30, 40, 50});
270 for (
auto *node :
nodes)
273 auto [pos, node] = tree.find_position(30);
281 auto nodes = make_nodes({10, 20, 30, 40, 50});
282 for (
auto *node :
nodes)
286 auto [pos, node] = tree.find_position(25);
296 EXPECT_NE(tree.insert_dup(make_node(42)),
nullptr);
297 EXPECT_NE(tree.insert_dup(make_node(42)),
nullptr);
298 EXPECT_NE(tree.insert_dup(make_node(42)),
nullptr);
310 auto nodes = make_nodes({10, 20, 30, 40, 50});
311 for (
auto *node :
nodes)
333 auto nodes = make_nodes({10, 20, 30});
334 for (
auto *node :
nodes)
346 auto nodes = make_nodes({10, 20, 30});
347 for (
auto *node :
nodes)
363 auto nodes = make_nodes({10, 20, 30, 40, 50});
364 for (
auto *node :
nodes)
383 auto nodes = make_nodes({10, 20, 30});
384 for (
auto *node :
nodes)
396 auto nodes = make_nodes({10, 20, 30});
397 for (
auto *node :
nodes)
403 tree2 = std::move(tree);
421 std::mt19937
rng(42);
422 std::uniform_int_distribution<int> dist(1, 1000);
446 for (
size_t i = 0; i <
keys.size(); ++i)
471 std::set<int> reference;
472 std::vector<RbNodeRk<int>*> all_nodes;
474 std::mt19937
rng(12345);
475 std::uniform_int_distribution<int>
key_dist(1, 5000);
476 std::uniform_int_distribution<int>
op_dist(0, 2);
478 auto make = [&all_nodes](
int k) {
480 all_nodes.push_back(n);
486 for (
int i = 0; i <
NUM_OPS; ++i)
493 auto *node = make(key);
507 bool ref_found = (reference.count(key) > 0);
520 for (
auto *n : all_nodes)
527 std::vector<RbNodeRk<int>*>
nodes;
531 for (
int i = 0; i <
N; ++i)
534 nodes.push_back(node);
542 for (
int i = 0; i <
N; i += 100)
549 for (
auto *n :
nodes)
559 auto nodes = make_nodes({50, 25, 75, 10, 30});
560 for (
auto *node :
nodes)
567 std::vector<int>
expected = {10, 25, 30, 50, 75};
577 ::testing::InitGoogleTest(&
argc,
argv);
WeightedDigraph::Node Node
Node * select(size_t i) const
Select i-th node in order.
Node * search(const Key &key) const noexcept
Search for a key.
Node * insert(Node *p) noexcept
Insert a node.
size_t size() const noexcept
Get number of nodes O(1)
void split_pos(size_t pos, GenTdRbTreeRk &t1, GenTdRbTreeRk &t2) noexcept
Split tree by position.
Node * remove(const Key &key) noexcept
Remove node with given key.
bool verify() const noexcept
Verify tree properties.
Extended Red-Black node with subtree counter.
Node for QuadTree spatial data structure.
Node * make_node(int key)
std::vector< Node * > make_nodes(const std::vector< int > &keys)
std::vector< Node * > allocated_nodes
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.
Red-Black binary search tree with nodes without virtual destructor and with subtree counters for sele...
TEST_F(TdRbTreeRkTest, EmptyTree)
Red-Black tree with rank (order statistics).
Top-down Red-Black tree with rank support.