AlgoPlus v0.1.0
Loading...
Searching...
No Matches
splay_tree.h
1#ifndef SPLAY_TREE_H
2#define SPLAY_TREE_H
3
4#ifdef ENABLE_TREE_VISUALIZATION
5#include "../../visualization/tree_visual/tree_visualization.h"
6#endif
7
8#ifdef __cplusplus
9#include <functional>
10#include <iostream>
11#include <memory>
12#include <queue>
13#include <vector>
14#endif
15
19template <typename T> class splay_tree {
20 private:
27 struct node {
28 T info;
29 std::shared_ptr<node> right;
30 std::shared_ptr<node> left;
31 node(T key = 0) : info(key), right(nullptr), left(nullptr) {}
32 };
33 std::shared_ptr<node> root;
34 size_t _size{0};
35
36 public:
42 inline explicit splay_tree(std::vector<T> v = {}) noexcept : root(nullptr) {
43 if (!v.empty()) {
44 for (T& x : v) {
45 this->insert(x);
46 }
47 }
48 }
49
54 inline explicit splay_tree(const splay_tree& s) : root(s.root), _size(s._size) {}
55
61 inline splay_tree& operator=(const splay_tree& s) {
62 root = s.root;
63 _size = s._size;
64 return *this;
65 }
66
67 inline ~splay_tree() { root = nullptr; }
68
72 inline void clear() {
73 root = nullptr;
74 _size = 0;
75 }
76
82 inline void insert(T key) {
83 root = _insert(root, key);
84 _size++;
85 }
86
92 inline void remove(T key) {
93 root = _remove(root, key);
94 _size--;
95 }
96
104 inline bool search(T key) {
105 std::shared_ptr<node> ans = splay(root, key);
106 return (ans && ans->info == key);
107 }
108
114 inline size_t size() { return _size; }
115
116 class Iterator;
117
118 inline Iterator begin() {
119 std::vector<T> ino = this->inorder();
120 return Iterator(0, ino);
121 }
122
123 inline Iterator end() {
124 std::vector<T> ino = this->inorder();
125 return Iterator(ino.size(), ino);
126 }
127
132 inline std::vector<T> inorder() {
133 std::vector<T> path;
134 _inorder([&](std::shared_ptr<node> callbacked) { path.push_back(callbacked->info); }, root);
135 return path;
136 }
137
142 inline std::vector<T> preorder() {
143 std::vector<T> path;
144 _preorder([&](std::shared_ptr<node> callbacked) { path.push_back(callbacked->info); },
145 root);
146 return path;
147 }
148
153 inline std::vector<T> postorder() {
154 std::vector<T> path;
155 _postorder([&](std::shared_ptr<node> callbacked) { path.push_back(callbacked->info); },
156 root);
157 return path;
158 }
159
164 inline std::vector<std::vector<T>> level_order() {
165 std::vector<std::vector<T>> path;
166 std::queue<std::shared_ptr<node>> q;
167 q.push(root);
168 while (!q.empty()) {
169 size_t size = q.size();
170 std::vector<T> level;
171 for (size_t i = 0; i < size; i++) {
172 std::shared_ptr<node> current = q.front();
173 q.pop();
174 level.push_back(current->info);
175 if (current->left) {
176 q.push(current->left);
177 }
178 if (current->right) {
179 q.push(current->right);
180 }
181 }
182 path.push_back(level);
183 }
184 return path;
185 }
186
191#ifdef TREE_VISUALIZATION_H
192 inline void visualize() {
193 std::string _generated = generate_visualization();
194 tree_visualization::visualize(_generated);
195 }
196#endif
197
201 inline friend std::ostream& operator<<(std::ostream& out, splay_tree<T>& t) {
202 std::vector<T> order = t.inorder();
203 for (int i = 0; i < order.size(); i++) {
204 if (i != order.size() - 1) {
205 out << order[i] << ", ";
206 } else {
207 out << order[i] << '\n';
208 }
209 }
210 return out;
211 }
212
213 private:
214 std::shared_ptr<node> rrotate(std::shared_ptr<node> _node) {
215 std::shared_ptr<node> y = _node->left;
216 _node->left = y->right;
217 y->right = _node;
218 return y;
219 }
220
221 std::shared_ptr<node> lrotate(std::shared_ptr<node> _node) {
222 std::shared_ptr<node> y = _node->right;
223 _node->right = y->left;
224 y->left = _node;
225 return y;
226 }
227
228 std::shared_ptr<node> splay(std::shared_ptr<node> _node, T key) {
229 if (!_node || _node->info == key) {
230 return _node;
231 }
232 if (_node->info > key) {
233 if (_node->left == NULL)
234 return _node;
235 if (_node->left->info > key) {
236 _node->left->left = splay(_node->left->left, key);
237 _node = rrotate(_node);
238 } else if (_node->left->info < key) {
239 _node->left->right = splay(_node->left->right, key);
240 if (_node->left->right != NULL)
241 _node->left = lrotate(_node->left);
242 }
243 return (_node->left == NULL) ? _node : rrotate(_node);
244 } else {
245 if (_node->right == NULL)
246 return _node;
247 if (_node->right->info > key) {
248 _node->right->left = splay(_node->right->left, key);
249 if (_node->right->left != NULL)
250 _node->right = rrotate(_node->right);
251 } else if (_node->right->info < key) {
252 _node->right->right = splay(_node->right->right, key);
253 _node = lrotate(_node);
254 }
255 return (_node->right == NULL) ? _node : lrotate(_node);
256 }
257 }
258
259 std::shared_ptr<node> _insert(std::shared_ptr<node> root, T key) {
260 if (!root) {
261 std::shared_ptr<node> nn = std::make_shared<node>(key);
262 return nn;
263 }
264 root = splay(root, key);
265 if (root->info == key) {
266 return root;
267 }
268
269 std::shared_ptr<node> nn = std::make_shared<node>(key);
270 if (root->info > key) {
271 nn->right = root;
272 nn->left = root->left;
273 root->left = nullptr;
274 } else {
275 nn->left = root;
276 nn->right = root->right;
277 root->right = nullptr;
278 }
279 return nn;
280 }
281
282 std::shared_ptr<node> _remove(std::shared_ptr<node> root, T key) {
283 if (!root) {
284 return nullptr;
285 }
286 root = splay(root, key);
287 if (key != root->info) {
288 return root;
289 }
290
291 std::shared_ptr<node> temp;
292 temp = root;
293 if (!root->left) {
294 root = root->right;
295 } else {
296 root = splay(root->left, key);
297 root->right = temp->right;
298 }
299 return root;
300 }
301
302 void _inorder(std::function<void(std::shared_ptr<node>)> callback, std::shared_ptr<node> root) {
303 if (root) {
304 _inorder(callback, root->left);
305 callback(root);
306 _inorder(callback, root->right);
307 }
308 }
309
310 void _postorder(std::function<void(std::shared_ptr<node>)> callback,
311 std::shared_ptr<node> root) {
312 if (root) {
313 _postorder(callback, root->left);
314 _postorder(callback, root->right);
315 callback(root);
316 }
317 }
318
319 void _preorder(std::function<void(std::shared_ptr<node>)> callback,
320 std::shared_ptr<node> root) {
321 if (root) {
322 callback(root);
323 _preorder(callback, root->left);
324 _preorder(callback, root->right);
325 }
326 }
327
328 std::string generate_visualization() {
329 std::string _generate = _inorder_gen(root);
330 return _generate;
331 }
332
333 std::string _inorder_gen(std::shared_ptr<node> root) {
334 std::string _s;
335 if (std::is_same_v<T, char> || std::is_same_v<T, std::string>) {
336 if (root->left) {
337 _s += root->info;
338 _s += "->";
339 _s += root->left->info;
340 _s += "\n";
341 _s += _inorder_gen(root->left);
342 }
343 if (root->right) {
344 _s += root->info;
345 _s += "->";
346 _s += root->right->info;
347 _s += "\n";
348 _s += _inorder_gen(root->right);
349 }
350 } else {
351 if (root->left) {
352 _s += std::to_string(root->info) + "->" + std::to_string(root->left->info) + "\n" +
353 _inorder_gen(root->left);
354 }
355 if (root->right) {
356 _s += std::to_string(root->info) + "->" + std::to_string(root->right->info) + "\n" +
357 _inorder_gen(root->right);
358 }
359 }
360 return _s;
361 }
362};
363
367template <typename T> class splay_tree<T>::Iterator {
368 private:
369 std::vector<T> elements;
370 int64_t index;
371
372 public:
378 explicit Iterator(const int64_t& index, std::vector<T>& els) noexcept
379 : index(index), elements(els) {}
380
387 Iterator& operator=(int64_t index) {
388 this->index = index;
389 return *(this);
390 }
391
398 if (this->index < elements.size()) {
399 this->index++;
400 }
401 return *(this);
402 }
403
410 Iterator it = *this;
411 ++*(this);
412 return it;
413 }
414
421 if (this->index > 0) {
422 this->index--;
423 }
424 return *(this);
425 }
426
433 Iterator it = *this;
434 --*(this);
435 return it;
436 }
437
445 bool operator!=(const Iterator& it) { return index != it.index; }
446
452 T operator*() { return elements[index]; }
453};
454
455#endif
Iterator & operator--()
operator – for type Iterator
Definition splay_tree.h:420
T operator*()
operator * for type Iterator
Definition splay_tree.h:452
Iterator & operator=(int64_t index)
= operator for Iterator type
Definition splay_tree.h:387
Iterator operator++(int)
operator ++ for type Iterator
Definition splay_tree.h:409
Iterator operator--(int)
operator – for type Iterator
Definition splay_tree.h:432
bool operator!=(const Iterator &it)
operator != for type Iterator
Definition splay_tree.h:445
Iterator(const int64_t &index, std::vector< T > &els) noexcept
Construct a new Iterator object.
Definition splay_tree.h:378
Iterator & operator++()
operator ++ for type Iterator
Definition splay_tree.h:397
splay tree class
Definition splay_tree.h:19
std::vector< T > postorder()
postorder function.
Definition splay_tree.h:153
std::vector< std::vector< T > > level_order()
level order function
Definition splay_tree.h:164
void insert(T key)
insert function
Definition splay_tree.h:82
void clear()
clear function
Definition splay_tree.h:72
std::vector< T > inorder()
inorder function.
Definition splay_tree.h:132
splay_tree(std::vector< T > v={}) noexcept
Construct a new splay tree object.
Definition splay_tree.h:42
std::vector< T > preorder()
preorder function.
Definition splay_tree.h:142
splay_tree(const splay_tree &s)
Copy constructor for splay tree class.
Definition splay_tree.h:54
void remove(T key)
remove function
Definition splay_tree.h:92
friend std::ostream & operator<<(std::ostream &out, splay_tree< T > &t)
visualize function
Definition splay_tree.h:201
splay_tree & operator=(const splay_tree &s)
operator = for splay tree class
Definition splay_tree.h:61
bool search(T key)
search function
Definition splay_tree.h:104
size_t size()
size function
Definition splay_tree.h:114