2#include "../include/cppx.h"
27template <
typename T> Node<T> *RBTree<T>::tree_minimum(Node<T> *node)
const
34template <
typename T>
void RBTree<T>::rotate_left(Node<T> *x)
36 Node<T> *y = x->p_right;
37 Node<T> *p = x->p_parent;
39 x->p_right = y->p_left;
41 y->p_left->p_parent = x;
49 else if (p->p_left == x)
55template <
typename T>
void RBTree<T>::rotate_right(Node<T> *x)
57 Node<T> *y = x->p_left;
58 Node<T> *p = x->p_parent;
60 x->p_left = y->p_right;
62 y->p_right->p_parent = x;
70 else if (p->p_left == x)
86 z->p_parent =
nullptr;
103 this->m_pool.deallocate(
z);
114 fix_insert_violation(
z);
119 while (
z->p_parent &&
z->p_parent->m_color ==
Color::RED)
140 if (z == parent->p_right)
144 parent = z->p_parent;
145 grandparent = parent->p_parent;
150 rotate_right(grandparent);
155 Node<T> *uncle = grandparent->p_left;
166 if (z == parent->p_left)
170 parent = z->p_parent;
171 grandparent = parent->p_parent;
176 rotate_left(grandparent);
191 else if (
val >
z->m_data)
210 x->p_parent =
z->p_parent;
214 else if (
z->p_parent->p_left ==
z)
215 z->p_parent->p_left =
x;
217 z->p_parent->p_right =
x;
219 this->m_pool.deallocate(
z);
221 else if (!
z->p_right)
227 x->p_parent =
z->p_parent;
231 else if (
z->p_parent->p_left ==
z)
232 z->p_parent->p_left =
x;
234 z->p_parent->p_right =
x;
236 this->m_pool.deallocate(
z);
240 y = tree_minimum(
z->p_right);
244 if (
y->p_parent ==
z)
251 y->p_left =
z->p_left;
253 z->p_left->p_parent =
y;
257 else if (
z->p_parent->p_left ==
z)
258 z->p_parent->p_left =
y;
260 z->p_parent->p_right =
y;
262 y->p_parent =
z->p_parent;
263 y->m_color =
z->m_color;
264 this->m_pool.deallocate(
z);
271 x->p_parent =
y->p_parent;
273 if (
y->p_parent->p_left ==
y)
274 y->p_parent->p_left =
x;
276 y->p_parent->p_right =
x;
278 y->p_left =
z->p_left;
280 z->p_left->p_parent =
y;
282 y->p_right =
z->p_right;
284 z->p_right->p_parent =
y;
288 else if (
z->p_parent->p_left ==
z)
289 z->p_parent->p_left =
y;
291 z->p_parent->p_right =
y;
293 y->p_parent =
z->p_parent;
294 y->m_color =
z->m_color;
295 this->m_pool.deallocate(
z);
333 x_parent = x->p_parent;
343 w = x_parent->p_right;
346 w->m_color = x_parent->m_color;
350 rotate_left(x_parent);
356 Node<T> *w = x_parent->p_left;
365 rotate_right(x_parent);
366 w = x_parent->p_left;
375 x_parent = x->p_parent;
385 w = x_parent->p_left;
388 w->m_color = x_parent->m_color;
392 rotate_right(x_parent);
404 this->destroy_subtree(this->p_head);
405 this->p_head =
nullptr;
424 return compute_black_height(this->p_head);
440 if (node->p_left && node->p_left->p_parent != node)
442 if (node->p_right && node->p_right->p_parent != node)
445 return validate_rb_helper(node->p_left) && validate_rb_helper(node->p_right);
456 if (!validate_rb_helper(this->p_head))
459 if (compute_black_height(this->p_head) == -1)
462 if (this->p_head->p_parent !=
nullptr)
471 std::stack<const Node<T> *>
s;
474 while (
curr || !
s.empty())
static bool is_black(const Node< T > *node)
static bool is_red(const Node< T > *node)
bool validate_rb_properties() const
static Color get_color(const Node< T > *node)
std::vector< T > to_sorted_vector() const
void remove(const T &val) override
int get_black_height() const
void insert(const T &val) override