29 std::shared_ptr<node> right;
30 std::shared_ptr<node> left;
31 node(T key = 0) : info(key), right(
nullptr), left(
nullptr) {}
33 std::shared_ptr<node> root;
42 inline explicit splay_tree(std::vector<T> v = {})
noexcept : root(nullptr) {
83 root = _insert(root, key);
93 root = _remove(root, key);
105 std::shared_ptr<node> ans = splay(root, key);
106 return (ans && ans->info == key);
114 inline size_t size() {
return _size; }
118 inline Iterator begin() {
119 std::vector<T> ino = this->inorder();
120 return Iterator(0, ino);
123 inline Iterator end() {
124 std::vector<T> ino = this->inorder();
125 return Iterator(ino.size(), ino);
134 _inorder([&](std::shared_ptr<node> callbacked) { path.push_back(callbacked->info); }, root);
144 _preorder([&](std::shared_ptr<node> callbacked) { path.push_back(callbacked->info); },
155 _postorder([&](std::shared_ptr<node> callbacked) { path.push_back(callbacked->info); },
165 std::vector<std::vector<T>> path;
166 std::queue<std::shared_ptr<node>> q;
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();
174 level.push_back(current->info);
176 q.push(current->left);
178 if (current->right) {
179 q.push(current->right);
182 path.push_back(level);
191#ifdef TREE_VISUALIZATION_H
192 inline void visualize() {
193 std::string _generated = generate_visualization();
194 tree_visualization::visualize(_generated);
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] <<
", ";
207 out << order[i] <<
'\n';
214 std::shared_ptr<node> rrotate(std::shared_ptr<node> _node) {
215 std::shared_ptr<node> y = _node->left;
216 _node->left = y->right;
221 std::shared_ptr<node> lrotate(std::shared_ptr<node> _node) {
222 std::shared_ptr<node> y = _node->right;
223 _node->right = y->left;
228 std::shared_ptr<node> splay(std::shared_ptr<node> _node, T key) {
229 if (!_node || _node->info == key) {
232 if (_node->info > key) {
233 if (_node->left == NULL)
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);
243 return (_node->left == NULL) ? _node : rrotate(_node);
245 if (_node->right == NULL)
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);
255 return (_node->right == NULL) ? _node : lrotate(_node);
259 std::shared_ptr<node> _insert(std::shared_ptr<node> root, T key) {
261 std::shared_ptr<node> nn = std::make_shared<node>(key);
264 root = splay(root, key);
265 if (root->info == key) {
269 std::shared_ptr<node> nn = std::make_shared<node>(key);
270 if (root->info > key) {
272 nn->left = root->left;
273 root->left =
nullptr;
276 nn->right = root->right;
277 root->right =
nullptr;
282 std::shared_ptr<node> _remove(std::shared_ptr<node> root, T key) {
286 root = splay(root, key);
287 if (key != root->info) {
291 std::shared_ptr<node> temp;
296 root = splay(root->left, key);
297 root->right = temp->right;
302 void _inorder(std::function<
void(std::shared_ptr<node>)> callback, std::shared_ptr<node> root) {
304 _inorder(callback, root->left);
306 _inorder(callback, root->right);
310 void _postorder(std::function<
void(std::shared_ptr<node>)> callback,
311 std::shared_ptr<node> root) {
313 _postorder(callback, root->left);
314 _postorder(callback, root->right);
319 void _preorder(std::function<
void(std::shared_ptr<node>)> callback,
320 std::shared_ptr<node> root) {
323 _preorder(callback, root->left);
324 _preorder(callback, root->right);
328 std::string generate_visualization() {
329 std::string _generate = _inorder_gen(root);
333 std::string _inorder_gen(std::shared_ptr<node> root) {
335 if (std::is_same_v<T, char> || std::is_same_v<T, std::string>) {
339 _s += root->left->info;
341 _s += _inorder_gen(root->left);
346 _s += root->right->info;
348 _s += _inorder_gen(root->right);
352 _s += std::to_string(root->info) +
"->" + std::to_string(root->left->info) +
"\n" +
353 _inorder_gen(root->left);
356 _s += std::to_string(root->info) +
"->" + std::to_string(root->right->info) +
"\n" +
357 _inorder_gen(root->right);