29 this->
insert({x.first, x.second});
66 inline void insert(std::pair<T, T> p) {
67 interval i = interval(p);
68 root = _insert(root, i);
76 inline bool search(std::pair<T, T> p) {
80 interval i = interval(p);
81 if (this->
overlap({root->i->low, root->i->high}, p)) {
84 return _search(root, i);
91 inline void remove(std::pair<T, T> p) {
92 interval i = interval(p);
93 root = _remove(root, i);
102 inline bool overlap(std::pair<T, T> p1, std::pair<T, T> p2) {
103 interval i1 = interval(p1), i2 = interval(p2);
104 return i1.high >= i2.low && i1.low <= i2.high;
115 std::vector<std::pair<T, T>> ino = this->
inorder();
125 std::vector<std::pair<T, T>> ino = this->
inorder();
134 inline size_t size() {
return _size; }
140 inline std::vector<std::pair<T, T>>
inorder() {
141 std::vector<std::pair<T, T>> path;
143 [&](std::shared_ptr<node> callbacked) {
144 path.push_back({callbacked->i->low, callbacked->i->high});
155 std::vector<std::pair<T, T>> path;
157 [&](std::shared_ptr<node> callbacked) {
158 path.push_back({callbacked->i->low, callbacked->i->high});
169 std::vector<std::pair<T, T>> path;
171 [&](std::shared_ptr<node> callbacked) {
172 path.push_back({callbacked->i->low, callbacked->i->high});
183 std::vector<std::vector<std::pair<T, T>>> path;
184 std::queue<std::shared_ptr<node>> q;
187 size_t size = q.size();
188 std::vector<std::pair<T, T>> level;
189 for (
size_t i = 0; i <
size; i++) {
190 std::shared_ptr<node> current = q.front();
192 level.push_back({current->i->low, current->i->high});
194 q.push(current->left);
196 if (current->right) {
197 q.push(current->right);
200 path.push_back(level);
205#ifdef TREE_VISUALIZATION_H
206 inline void visualize() {
207 std::string _generated = generate_visualization();
208 tree_visualization::visualize(_generated);
216 std::vector<std::vector<std::pair<T, T>>> order = t.
level_order();
217 for (std::vector<std::pair<T, T>>& x : order) {
218 for (
size_t i = 0; i < x.size(); i++) {
219 if (i != x.size() - 1) {
220 out <<
'[' << x[i].first <<
"," << x[i].second <<
']' <<
", ";
222 out <<
'[' << x[i].first <<
"," << x[i].second <<
']' <<
'\n';
238 interval(std::pair<T, T> p)
239 : low(std::min(p.first, p.second)), high(std::max(p.first, p.second)) {}
253 std::shared_ptr<node> right;
254 std::shared_ptr<node> left;
255 node(interval n) : i(new interval(n)), max(n.high), right(nullptr), left(nullptr) {}
258 std::shared_ptr<node> root;
261 std::shared_ptr<node> new_node(interval i) {
262 std::shared_ptr<node> p = std::make_shared<node>(i);
269 std::shared_ptr<node> _insert(std::shared_ptr<node> root, interval i) {
275 root->left = _insert(root->left, i);
277 root->right = _insert(root->right, i);
279 if (root->max < i.high) {
288 bool _search(std::shared_ptr<node> root, interval i) {
292 if (root->left && root->left->max >= i.low) {
293 return _search(root->left, i);
295 return _search(root->right, i);
301 std::shared_ptr<node> _remove(std::shared_ptr<node> root, interval i) {
305 std::shared_ptr<node> p = root;
307 if (p->i->low > i.low) {
309 }
else if (p->i->low < i.low) {
312 if (!p->right && !p->left) {
315 }
else if (p->right && !p->left) {
316 std::shared_ptr<node> temp = root->right;
319 }
else if (p->left && !p->right) {
320 std::shared_ptr<node> temp = p->left;
324 std::shared_ptr<node> temp = root;
325 while (temp && temp->left) {
330 p->right = _remove(p->right, *temp->i);
337 void _inorder(std::function<
void(std::shared_ptr<node>)> callback, std::shared_ptr<node> root) {
339 _inorder(callback, root->left);
341 _inorder(callback, root->right);
345 void _postorder(std::function<
void(std::shared_ptr<node>)> callback,
346 std::shared_ptr<node> root) {
348 _postorder(callback, root->left);
349 _postorder(callback, root->right);
354 void _preorder(std::function<
void(std::shared_ptr<node>)> callback,
355 std::shared_ptr<node> root) {
358 _preorder(callback, root->left);
359 _preorder(callback, root->right);
363 std::string generate_visualization() {
364 std::string _generate = _inorder_gen(root);
368 std::string _inorder_gen(std::shared_ptr<node> root) {
370 if (std::is_same_v<T, char> || std::is_same_v<T, std::string>) {
379 _s += root->left->i->low;
381 _s += root->left->i->high;
384 _s += _inorder_gen(root->left);
394 _s += root->right->i->low;
396 _s += root->right->i->high;
399 _s += _inorder_gen(root->right);
404 _s += std::to_string(root->i->low);
406 _s += std::to_string(root->i->high);
410 _s += std::to_string(root->left->i->low);
412 _s += std::to_string(root->left->i->high);
415 _s += _inorder_gen(root->left);
419 _s += std::to_string(root->i->low);
421 _s += std::to_string(root->i->high);
425 _s += std::to_string(root->right->i->low);
427 _s += std::to_string(root->right->i->high);
430 _s += _inorder_gen(root->right);