AlgoPlus v0.1.0
Loading...
Searching...
No Matches
avl_tree.h
1#ifndef AVL_TREE_H
2#define AVL_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 <memory>
11#include <queue>
12#include <string>
13#include <vector>
14#endif
15
19template <typename T> class avl_tree {
20 public:
26 inline explicit avl_tree(std::vector<T> _elements = {}) noexcept : root(nullptr) {
27 if (!_elements.empty()) {
28 for (T& x : _elements) {
29 this->insert(x);
30 }
31 }
32 }
33
38 inline explicit avl_tree(const avl_tree& a) : root(a.root), _size(a._size) {}
39
45 inline avl_tree& operator=(const avl_tree& a) {
46 root = a.root;
47 _size = a._size;
48 return *this;
49 }
50
55 inline ~avl_tree() noexcept {}
56
61 inline void insert(T key) {
62 root = _insert(root, key);
63 _size++;
64 }
65
70 inline void clear() {
71 root = nullptr;
72 _size = 0;
73 return;
74 }
75
81 inline T get_root() { return this->root->info; }
82
88 inline bool search(T key) { return _search(root, key); }
89
90 class Iterator;
91
97 inline Iterator begin() {
98 std::vector<T> ino = this->inorder();
99 return Iterator(0, ino);
100 }
101
107 inline Iterator end() {
108 std::vector<T> ino = this->inorder();
109 return Iterator(ino.size(), ino);
110 }
111
117 inline size_t size() const { return _size; }
118
123 inline void remove(T key) { root = _remove(root, key); }
124
129 inline std::vector<T> inorder() const {
130 std::vector<T> path;
131 _inorder([&](std::shared_ptr<node> callbacked) { path.push_back(callbacked->info); }, root);
132 return path;
133 }
134
138 inline std::vector<T> preorder() const {
139 std::vector<T> path;
140 _preorder([&](std::shared_ptr<node> callbacked) { path.push_back(callbacked->info); },
141 root);
142 return path;
143 }
144
148 inline std::vector<T> postorder() const {
149 std::vector<T> path;
150 _postorder([&](std::shared_ptr<node> callbacked) { path.push_back(callbacked->info); },
151 root);
152 return path;
153 }
154
159 inline std::vector<std::vector<T>> level_order() {
160 std::vector<std::vector<T>> path;
161 std::queue<std::shared_ptr<node>> q;
162 q.push(root);
163 while (!q.empty()) {
164 size_t size = q.size();
165 std::vector<T> level;
166 for (size_t i = 0; i < size; i++) {
167 std::shared_ptr<node> current = q.front();
168 q.pop();
169 level.push_back(current->info);
170 if (current->left) {
171 q.push(current->left);
172 }
173 if (current->right) {
174 q.push(current->right);
175 }
176 }
177 path.push_back(level);
178 }
179 return path;
180 }
181
186
187#ifdef TREE_VISUALIZATION_H
188 inline void visualize() {
189 std::string _generated = generate_visualization();
190 tree_visualization::visualize(_generated);
191 }
192#endif
193
197 inline friend std::ostream& operator<<(std::ostream& out, avl_tree<T>& t) {
198 std::vector<T> order = t.inorder();
199 for (int i = 0; i < order.size(); i++) {
200 if (i != order.size() - 1) {
201 out << order[i] << ", ";
202 } else {
203 out << order[i] << '\n';
204 }
205 }
206 return out;
207 }
208
209 private:
217 typedef struct node {
218 T info;
219 int64_t height{0};
220 std::shared_ptr<node> left;
221 std::shared_ptr<node> right;
222 node(T key) : info(key), left(nullptr), right(nullptr) {}
223 } node;
224
225 std::shared_ptr<node> root;
226 size_t _size{};
227
228 int64_t height(std::shared_ptr<node> root) {
229 if (root == nullptr)
230 return 0;
231 return 1 + std::max(height(root->left), height(root->right));
232 }
233
234 std::shared_ptr<node> createNode(T info) {
235 std::shared_ptr<node> nn = std::make_shared<node>(info);
236 return nn;
237 }
238
239 int64_t getBalance(std::shared_ptr<node> root) {
240 return height(root->left) - height(root->right);
241 }
242
243 std::shared_ptr<node> rightRotate(std::shared_ptr<node> root) {
244 std::shared_ptr<node> t = root->left;
245 std::shared_ptr<node> u = t->right;
246 t->right = root;
247 root->left = u;
248 return t;
249 }
250
251 std::shared_ptr<node> leftRotate(std::shared_ptr<node> root) {
252 std::shared_ptr<node> t = root->right;
253 std::shared_ptr<node> u = t->left;
254 t->left = root;
255 root->right = u;
256 return t;
257 }
258
259 std::shared_ptr<node> minValue(std::shared_ptr<node> root) {
260 if (root->left == nullptr)
261 return root;
262 return minValue(root->left);
263 }
264
265 std::shared_ptr<node> _insert(std::shared_ptr<node> root, T item) {
266 std::shared_ptr<node> nn = createNode(item);
267 if (root == nullptr)
268 return nn;
269 if (item < root->info) {
270 root->left = _insert(root->left, item);
271 } else if (item > root->info) {
272 root->right = _insert(root->right, item);
273 } else {
274 return root;
275 }
276 int b = getBalance(root);
277 if (b > 1) {
278 if (getBalance(root->left) < 0)
279 root->left = leftRotate(root->left);
280 return rightRotate(root);
281 } else if (b < -1) {
282 if (getBalance(root->right) > 0)
283 root->right = rightRotate(root->right);
284 return leftRotate(root);
285 }
286 return root;
287 }
288
289 std::shared_ptr<node> _remove(std::shared_ptr<node> root, T key) {
290 if (root == nullptr)
291 return root;
292 if (key < root->info)
293 root->left = _remove(root->left, key);
294 else if (key > root->info)
295 root->right = _remove(root->right, key);
296
297 else {
298 if (!root->right) {
299 std::shared_ptr<node> temp = root->left;
300 root = nullptr;
301 _size--;
302 return temp;
303 } else if (!root->left) {
304 std::shared_ptr<node> temp = root->right;
305 root = nullptr;
306 _size--;
307 return temp;
308 }
309 std::shared_ptr<node> temp = minValue(root->right);
310 root->info = temp->info;
311 root->right = _remove(root->right, temp->info);
312 }
313 return root;
314 }
315
316 bool _search(std::shared_ptr<node> root, T key) {
317 while (root) {
318 if (root->info < key) {
319 root = root->right;
320 } else if (root->info > key) {
321 root = root->left;
322 } else {
323 return true;
324 }
325 }
326 return false;
327 }
328
329 void _inorder(std::function<void(std::shared_ptr<node>)> callback,
330 std::shared_ptr<node> root) const {
331 if (root) {
332 _inorder(callback, root->left);
333 callback(root);
334 _inorder(callback, root->right);
335 }
336 }
337
338 void _postorder(std::function<void(std::shared_ptr<node>)> callback,
339 std::shared_ptr<node> root) const {
340 if (root) {
341 _inorder(callback, root->left);
342 _inorder(callback, root->right);
343 callback(root);
344 }
345 }
346
347 void _preorder(std::function<void(std::shared_ptr<node>)> callback,
348 std::shared_ptr<node> root) const {
349 if (root) {
350 callback(root);
351 _inorder(callback, root->left);
352 _inorder(callback, root->right);
353 }
354 }
355
356 std::string generate_visualization() {
357 std::string _generate = _inorder_gen(root);
358 return _generate;
359 }
360
361 std::string _inorder_gen(std::shared_ptr<node> root) {
362 std::string _s;
363 if (std::is_same_v<T, char> || std::is_same_v<T, std::string>) {
364 if (root->left) {
365 _s += root->info;
366 _s += "->";
367 _s += root->left->info;
368 _s += "\n";
369 _s += _inorder_gen(root->left);
370 }
371 if (root->right) {
372 _s += root->info;
373 _s += "->";
374 _s += root->right->info;
375 _s += "\n";
376 _s += _inorder_gen(root->right);
377 }
378 } else {
379 if (root->left) {
380 _s += std::to_string(root->info) + "->" + std::to_string(root->left->info) + "\n" +
381 _inorder_gen(root->left);
382 }
383 if (root->right) {
384 _s += std::to_string(root->info) + "->" + std::to_string(root->right->info) + "\n" +
385 _inorder_gen(root->right);
386 }
387 }
388 return _s;
389 }
390};
391
395template <typename T> class avl_tree<T>::Iterator {
396 private:
397 std::vector<T> elements;
398 int64_t index;
399
400 public:
406 explicit Iterator(const int64_t& index, std::vector<T>& els) noexcept
407 : index(index), elements(els) {}
408
415 Iterator& operator=(int64_t index) {
416 this->index = index;
417 return *(this);
418 }
419
426 if (this->index < elements.size()) {
427 this->index++;
428 }
429 return *(this);
430 }
431
438 Iterator it = *this;
439 ++*(this);
440 return it;
441 }
442
449 if (this->index > 0) {
450 this->index--;
451 }
452 return *(this);
453 }
454
461 Iterator it = *this;
462 --*(this);
463 return it;
464 }
465
474 bool operator!=(const Iterator& it) {
475 return index != it.index && elements[index] != it.elements[it.index];
476 }
477
483 T operator*() { return elements[index]; }
484};
485
486#endif
Iterator class.
Definition avl_tree.h:395
Iterator(const int64_t &index, std::vector< T > &els) noexcept
Construct a new Iterator object.
Definition avl_tree.h:406
bool operator!=(const Iterator &it)
operator != for type Iterator
Definition avl_tree.h:474
Iterator & operator--()
operator – for type Iterator
Definition avl_tree.h:448
Iterator & operator++()
operator ++ for type Iterator
Definition avl_tree.h:425
T operator*()
operator * for type Iterator
Definition avl_tree.h:483
Iterator operator++(int)
operator ++ for type Iterator
Definition avl_tree.h:437
Iterator & operator=(int64_t index)
= operator for Iterator type
Definition avl_tree.h:415
Iterator operator--(int)
operator – for type Iterator
Definition avl_tree.h:460
Iterator end()
pointer that points to end
Definition avl_tree.h:107
avl_tree(std::vector< T > _elements={}) noexcept
Contructor for AVL tree class.
Definition avl_tree.h:26
size_t size() const
size function
Definition avl_tree.h:117
Iterator begin()
pointer that points to begin
Definition avl_tree.h:97
void clear()
clear function Erase all the nodes from the tree.
Definition avl_tree.h:70
std::vector< T > preorder() const
preorder function.
Definition avl_tree.h:138
avl_tree(const avl_tree &a)
Copy constructor for avl tree class.
Definition avl_tree.h:38
bool search(T key)
search function.
Definition avl_tree.h:88
T get_root()
get_root function
Definition avl_tree.h:81
avl_tree & operator=(const avl_tree &a)
operator = for avl tree class
Definition avl_tree.h:45
void remove(T key)
remove function.
Definition avl_tree.h:123
~avl_tree() noexcept
Destroy the avl tree object.
Definition avl_tree.h:55
std::vector< T > postorder() const
postorder function.
Definition avl_tree.h:148
std::vector< std::vector< T > > level_order()
level order function.
Definition avl_tree.h:159
std::vector< T > inorder() const
inorder function.
Definition avl_tree.h:129
friend std::ostream & operator<<(std::ostream &out, avl_tree< T > &t)
visualize function
Definition avl_tree.h:197
void insert(T key)
insert function.
Definition avl_tree.h:61
@ key
the parser read a key of a value in an object
Definition json.hpp:11716