31 std::bitset<1> is_red;
32 std::shared_ptr<node> parent;
33 std::shared_ptr<node> right;
34 std::shared_ptr<node> left;
35 node(T key, std::shared_ptr<node> p)
36 : info(key), is_red(1), parent(p), right(
nullptr), left(
nullptr) {}
39 std::shared_ptr<node> root;
42 void _left_rotate(std::shared_ptr<node> t_node) {
43 std::shared_ptr<node> x = t_node->right;
44 x->parent = t_node->parent;
45 if (t_node->parent ==
nullptr)
47 else if (t_node->parent->left == t_node)
48 t_node->parent->left = x;
50 t_node->parent->right = x;
52 t_node->right = x->left;
54 t_node->right->parent = t_node;
59 void _right_rotate(std::shared_ptr<node> t_node) {
60 std::shared_ptr<node> x = t_node->left;
61 x->parent = t_node->parent;
62 if (t_node->parent ==
nullptr)
64 else if (t_node->parent->left == t_node)
65 t_node->parent->left = x;
67 t_node->parent->right = x;
69 t_node->left = x->right;
71 t_node->left->parent = t_node;
76 void _insert(std::shared_ptr<node> t_node) {
77 while (t_node->parent && t_node->parent->is_red == 1) {
78 std::shared_ptr<node> grand_parent = t_node->parent->parent;
79 if (t_node->parent == grand_parent->left) {
80 std::shared_ptr<node> uncle = grand_parent->right;
81 if (uncle && uncle->is_red == 1) {
82 grand_parent->is_red = 1;
84 t_node->parent->is_red = 0;
85 t_node = grand_parent;
87 if (t_node == t_node->parent->right) {
88 t_node = t_node->parent;
91 grand_parent = t_node->parent->parent;
93 grand_parent->is_red = 1;
94 t_node->parent->is_red = 0;
95 _right_rotate(grand_parent);
98 std::shared_ptr<node> uncle = grand_parent->left;
99 if (uncle && uncle->is_red == 1) {
100 grand_parent->is_red = 1;
102 t_node->parent->is_red = 0;
103 t_node = grand_parent;
105 if (t_node == t_node->parent->left) {
106 t_node = t_node->parent;
107 _right_rotate(t_node);
109 grand_parent = t_node->parent->parent;
111 grand_parent->is_red = 1;
112 t_node->parent->is_red = 0;
113 _left_rotate(grand_parent);
117 this->root->is_red = 0;
120 void _remove_helper(std::shared_ptr<node> t_node) {
121 if (t_node == this->root)
123 std::shared_ptr<node> sibling;
124 if (t_node->parent->left == t_node)
125 sibling = t_node->parent->right;
127 sibling = t_node->parent->left;
128 if (sibling ==
nullptr)
129 _remove_helper(t_node->parent);
131 if (sibling->is_red == 1) {
132 t_node->parent->is_red = 1;
134 if (t_node->parent->left == sibling)
135 _right_rotate(t_node->parent);
137 _left_rotate(t_node->parent);
138 _remove_helper(t_node);
140 if (sibling->left && sibling->left->is_red == 1) {
141 if (t_node->parent->left == sibling) {
142 sibling->left->is_red = sibling->is_red;
143 sibling->is_red = t_node->parent->is_red;
144 _right_rotate(t_node->parent);
146 sibling->left->is_red = t_node->parent->is_red;
147 _right_rotate(sibling);
148 _left_rotate(t_node->parent);
150 t_node->parent->is_red = 0;
151 }
else if (sibling->right && sibling->right->is_red == 1) {
152 if (t_node->parent->left == sibling) {
153 sibling->right->is_red = t_node->parent->is_red;
154 _left_rotate(sibling);
155 _right_rotate(t_node->parent);
157 sibling->right->is_red = sibling->is_red;
158 sibling->is_red = t_node->parent->is_red;
159 _left_rotate(t_node->parent);
161 t_node->parent->is_red = 0;
164 if (t_node->parent->is_red == 0)
165 _remove_helper(t_node->parent);
167 t_node->parent->is_red = 0;
173 void _remove(std::shared_ptr<node> t_node) {
174 if (t_node ==
nullptr)
176 std::shared_ptr<node> replace =
nullptr;
177 if (t_node->left && t_node->right) {
178 std::shared_ptr<node> tmp = t_node->right;
182 }
else if (t_node->left)
183 replace = t_node->left;
184 else if (t_node->right)
185 replace = t_node->right;
186 if (replace ==
nullptr) {
187 if (t_node == this->root)
188 this->root =
nullptr;
190 if (t_node->is_red == 0)
191 _remove_helper(t_node);
193 std::shared_ptr<node> sibling =
nullptr;
194 if (t_node->parent->left == t_node)
195 sibling = t_node->parent->right;
197 sibling = t_node->parent->left;
201 if (t_node->parent->left == t_node)
202 t_node->parent->left =
nullptr;
204 t_node->parent->right =
nullptr;
208 if (t_node->left ==
nullptr || t_node->right ==
nullptr) {
209 if (t_node == this->root) {
210 t_node->info = replace->info;
211 t_node->left =
nullptr;
212 t_node->right =
nullptr;
215 if (t_node->parent->left == t_node)
216 t_node->parent->left = replace;
218 t_node->parent->right = replace;
219 replace->parent = t_node->parent;
220 if (replace->is_red == 0 && t_node->is_red == 0)
221 _remove_helper(replace);
227 t_node->info = replace->info;
231 bool _search(T& key) {
232 std::shared_ptr<node> t_node = this->root;
234 if (key < t_node->info)
235 t_node = t_node->left;
236 else if (key == t_node->info)
239 t_node = t_node->right;
244 void _inorder(std::function<
void(T)> callback, std::shared_ptr<node> t_node)
const {
246 _inorder(callback, t_node->left);
247 callback(t_node->info);
248 _inorder(callback, t_node->right);
252 void _postorder(std::function<
void(T)> callback, std::shared_ptr<node> t_node)
const {
254 _postorder(callback, t_node->left);
255 _postorder(callback, t_node->right);
256 callback(t_node->info);
260 void _preorder(std::function<
void(T)> callback, std::shared_ptr<node> t_node)
const {
262 callback(t_node->info);
263 _preorder(callback, t_node->left);
264 _preorder(callback, t_node->right);
268 std::string _vis_gen(std::shared_ptr<node> t_node, T parent_info) {
270 if (std::is_same_v<T, char> || std::is_same_v<T, std::string>) {
271 _s += t_node->info +
" [shape=circle fontcolor=black color=";
272 if (t_node->is_red == 1)
277 _s += parent_info +
"->" + t_node->info +
'\n';
279 _s += std::to_string(t_node->info) +
" [shape=circle fontcolor=black color=";
280 if (t_node->is_red == 1)
285 _s += std::to_string(parent_info) +
"->" + std::to_string(t_node->info) +
'\n';
288 _s += _vis_gen(t_node->left, t_node->info);
290 _s += _vis_gen(t_node->right, t_node->info);
300 inline explicit red_black_tree(std::vector<T> _elements = {})
noexcept : root(nullptr) {
301 for (T& x : _elements) {
340 inline bool search(T key) {
return _search(key); }
347 std::shared_ptr<node> p =
nullptr;
348 std::shared_ptr<node> x = this->root;
356 std::shared_ptr<node> t_node = std::make_shared<node>(key, p);
374 std::shared_ptr<node> t_node = root;
375 while (t_node && t_node->info != key) {
376 if (key < t_node->info)
377 t_node = t_node->left;
379 t_node = t_node->right;
390 inline size_t size()
const {
return _size; }
406 _inorder([&](T callbacked) { path.push_back(callbacked); }, root);
416 _postorder([&](T callbacked) { path.push_back(callbacked); }, root);
426 _preorder([&](T callbacked) { path.push_back(callbacked); }, root);
435 std::vector<std::vector<T>> path;
436 std::queue<std::shared_ptr<node>> q;
439 size_t size = q.size();
440 std::vector<T> level;
441 for (
size_t i = 0; i <
size; i++) {
442 std::shared_ptr<node> current = q.front();
444 level.push_back(current->info);
446 q.push(current->left);
448 if (current->right) {
449 q.push(current->right);
452 path.push_back(level);
461 std::vector<T> order = rb.
inorder();
462 for (
int i = 0; i < order.size(); i++) {
463 if (i == order.size() - 1)
464 out << order[i] <<
'\n';
466 out << order[i] <<
", ";
478 std::vector<T> ino = this->
inorder();
487 std::vector<T> ino = this->
inorder();
495#ifdef TREE_VISUALIZATION_H
496 inline void visualize() {
497 std::string _generated;
499 if (std::is_same_v<T, char> || std::is_same_v<T, std::string>)
500 _generated += root->info;
502 _generated += std::to_string(root->info);
503 _generated +=
" [shape=circle fontcolor=black color=";
504 if (root->is_red == 1)
505 _generated +=
"red]\n";
507 _generated +=
"black]\n";
508 if (this->root->left)
509 _generated += this->_vis_gen(this->root->left, root->info);
510 if (this->root->right)
511 _generated += this->_vis_gen(this->root->right, root->info);
513 tree_visualization::visualize(_generated);