26 inline explicit avl_tree(std::vector<T> _elements = {})
noexcept : root(nullptr) {
27 if (!_elements.empty()) {
28 for (T& x : _elements) {
62 root = _insert(root, key);
81 inline T
get_root() {
return this->root->info; }
88 inline bool search(T key) {
return _search(root, key); }
98 std::vector<T> ino = this->
inorder();
108 std::vector<T> ino = this->
inorder();
117 inline size_t size()
const {
return _size; }
123 inline void remove(T key) { root = _remove(root, key); }
131 _inorder([&](std::shared_ptr<node> callbacked) { path.push_back(callbacked->info); }, root);
140 _preorder([&](std::shared_ptr<node> callbacked) { path.push_back(callbacked->info); },
150 _postorder([&](std::shared_ptr<node> callbacked) { path.push_back(callbacked->info); },
160 std::vector<std::vector<T>> path;
161 std::queue<std::shared_ptr<node>> q;
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();
169 level.push_back(current->info);
171 q.push(current->left);
173 if (current->right) {
174 q.push(current->right);
177 path.push_back(level);
187#ifdef TREE_VISUALIZATION_H
188 inline void visualize() {
189 std::string _generated = generate_visualization();
190 tree_visualization::visualize(_generated);
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] <<
", ";
203 out << order[i] <<
'\n';
217 typedef struct node {
220 std::shared_ptr<node> left;
221 std::shared_ptr<node> right;
222 node(T key) : info(
key), left(nullptr), right(nullptr) {}
225 std::shared_ptr<node> root;
228 int64_t height(std::shared_ptr<node> root) {
231 return 1 + std::max(height(root->left), height(root->right));
234 std::shared_ptr<node> createNode(T info) {
235 std::shared_ptr<node> nn = std::make_shared<node>(info);
239 int64_t getBalance(std::shared_ptr<node> root) {
240 return height(root->left) - height(root->right);
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;
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;
259 std::shared_ptr<node> minValue(std::shared_ptr<node> root) {
260 if (root->left ==
nullptr)
262 return minValue(root->left);
265 std::shared_ptr<node> _insert(std::shared_ptr<node> root, T item) {
266 std::shared_ptr<node> nn = createNode(item);
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);
276 int b = getBalance(root);
278 if (getBalance(root->left) < 0)
279 root->left = leftRotate(root->left);
280 return rightRotate(root);
282 if (getBalance(root->right) > 0)
283 root->right = rightRotate(root->right);
284 return leftRotate(root);
289 std::shared_ptr<node> _remove(std::shared_ptr<node> root, T key) {
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);
299 std::shared_ptr<node> temp = root->left;
303 }
else if (!root->left) {
304 std::shared_ptr<node> temp = root->right;
309 std::shared_ptr<node> temp = minValue(root->right);
310 root->info = temp->info;
311 root->right = _remove(root->right, temp->info);
316 bool _search(std::shared_ptr<node> root, T key) {
318 if (root->info < key) {
320 }
else if (root->info > key) {
329 void _inorder(std::function<
void(std::shared_ptr<node>)> callback,
330 std::shared_ptr<node> root)
const {
332 _inorder(callback, root->left);
334 _inorder(callback, root->right);
338 void _postorder(std::function<
void(std::shared_ptr<node>)> callback,
339 std::shared_ptr<node> root)
const {
341 _inorder(callback, root->left);
342 _inorder(callback, root->right);
347 void _preorder(std::function<
void(std::shared_ptr<node>)> callback,
348 std::shared_ptr<node> root)
const {
351 _inorder(callback, root->left);
352 _inorder(callback, root->right);
356 std::string generate_visualization() {
357 std::string _generate = _inorder_gen(root);
361 std::string _inorder_gen(std::shared_ptr<node> root) {
363 if (std::is_same_v<T, char> || std::is_same_v<T, std::string>) {
367 _s += root->left->info;
369 _s += _inorder_gen(root->left);
374 _s += root->right->info;
376 _s += _inorder_gen(root->right);
380 _s += std::to_string(root->info) +
"->" + std::to_string(root->left->info) +
"\n" +
381 _inorder_gen(root->left);
384 _s += std::to_string(root->info) +
"->" + std::to_string(root->right->info) +
"\n" +
385 _inorder_gen(root->right);