{"id":18541299,"url":"https://github.com/fernaper/splaytree","last_synced_at":"2025-07-01T22:32:03.405Z","repository":{"id":111647671,"uuid":"115127022","full_name":"fernaper/SplayTree","owner":"fernaper","description":"Splay Tree - v1.0.0 - Release","archived":false,"fork":false,"pushed_at":"2018-05-17T13:14:23.000Z","size":1841,"stargazers_count":1,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-15T03:43:12.094Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fernaper.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-12-22T15:23:14.000Z","updated_at":"2018-01-17T10:23:07.000Z","dependencies_parsed_at":"2023-05-25T04:00:40.046Z","dependency_job_id":null,"html_url":"https://github.com/fernaper/SplayTree","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/fernaper/SplayTree","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fernaper%2FSplayTree","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fernaper%2FSplayTree/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fernaper%2FSplayTree/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fernaper%2FSplayTree/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fernaper","download_url":"https://codeload.github.com/fernaper/SplayTree/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fernaper%2FSplayTree/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263046204,"owners_count":23405151,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-06T20:04:39.171Z","updated_at":"2025-07-01T22:32:03.286Z","avatar_url":"https://github.com/fernaper.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SplayTree v1.0.0 - Release\n\nEste es un proyecto realizado a modo de práctica, donde se crea una librería con la estructura de SplayTree.\n\nPero, ¿que és un **Splay Tree**?\n\nUn Splay Trees es un **árbol de búsqueda autoajustable que no realiza comprobación de la existencia de datos repetidos**.\n\nDicha estructura de datos, está compuesta de nodos, los cuáles he decidido definirlos cómo un “Struct” en lugar de una\nclase debido a que todos los datos que este tiene han de ser públicos para así poder realizar todas las operaciones deseadas.\n\nAsí mismo, la estructura nodo, está compuesta de otros 3 nodos y el valor de dicho nodo. Estos son, el hijo izquierdo, el\nhijo derecho y el nodo padre.\n\nLa existencia de un puntero al nodo padre es realmente interesante, porque durante el planteamiento inicial no existía, esto\nes debido a que de primeras, y siguiendo la estructura de un árbol normal, este no debería saber quién es su padre, no obstante,\npara crear un Splay Tree necesitaremos saber en muchas ocasiones quién es el padre o incluso el abuelo del nodo que estamos\ntratando, por tanto, resulta impracticable realizar una búsqueda de estos desde la raíz (no sólo en términos de complejidad,\nsino también en que un dato puede estar varias veces, y no sabríamos a cuál nos estamos refiriendo).\n\nUna vez aclarado el “Struct” nodo del que se compondrá la estructura, hay que entrar ya de lleno en la clase de esta.\n\nCómo datos privados de esta clase, he creado un nodo “root” que será considerado el origen, o la raíz de nuestro Splay Tree.\nEste nodo siempre tendrá que tener cómo padre “NULL”.\n\nPor otro lado, cómo métodos privados, he creado de manera auxiliar y para ir testeando el código, 3 métodos básicos de recorridos\nde un árbol (inorden, preorden y postorden).\n\nTambién he creado un método “destruir” que simplemente ayuda a borrar todos los nodos y liberar la memoria dinámica si es que la\nclase ha sido creada dinámicamente (realmente no lo uso).\n\nAhora, y entrando en uno de los métodos más importantes, esta “Splay” o flotación, el cuál ha sido creado de manera iterativa en\nlugar de recursiva debido a que las propuestas recursivas eran poco “elegantes”, no obstante, considero que puede haber opciones\nrecursivas, realmente buenas.\n\nContinuando con este método, realizo un bucle que se repetirá hasta que el nodo desde el cuál realizo el “Splay” suba a la raíz,\ncuando esto ocurra, al salir del bucle, actualizo el valor de mi variable “root” con dicho nodo.\n\nDentro del bucle obtengo el padre y el abuelo del nodo, sabiendo que si no tiene padre ha terminado (porque ya es la posición\nroot, cómo queríamos) y que si no tiene abuelo haremos una última rotación y saldremos.\n\nPor otro lado, si tiene abuelo, deberé realizar dos rotaciones (una sobre padre y otra sobre abuelo), dependiendo de en qué lado\n(en comparación con padre y abuelo) se encuentra nuestro nodo y continuará con otra vuelta del bucle (teniendo en cuenta que\nnuestro nodo ya ha escalado parcialmente por el Splay Tree).\n\nPor último, los métodos públicos son “insertar”, “buscar”, “borrar”, los 3 métodos de recorridos de listas (llaman a su vez a\nlos 3 métodos privados anteriormente descritos) y un método extra auxiliar que también sirve para mostrar el árbol, en esta\nocasión de una forma muy clara.\n\n- El método insertar primeramente comprobará si nuestro Splay Tree está vacío, si es así directamente creará el nodo y lo pondrá\nen “root”, si no es así, empieza el algoritmo de verdad.\nIrá buscando en qué posición le tocará insertarse, para ello mira el nodo y si el valor a insertar es mayor que el nodo, sigue\nmirando a la derecha, si es menor, sigue mirando hacia la izquierda.\nSi en algún momento hacia el lado que le toca mirar se encuentra a “NULL”, directamente lo inserta ahí y finalmente realizaría\nun “Splay” desde ese nodo (para ponerlo en “root”).\nCómo detalle, aclarar, que si el nodo que estamos mirando es igual que el que estamos insertando he elegido arbitrariamente \ninsertarlo a la izquierda.\n\n- El método buscar inicialmente devuelve “NULL” si “root” vale “NULL” (es decir si el árbol es vacío), y si no, lo que hará es\nmirar hacia la derecha si el valor buscado es mayor que el nodo que estás mirando, y por lo mismo, irá a la izquierda si es menor.\nSi encuentra un nodo con el valor buscado, se detiene, realiza el “Splay” sobre ese nodo y lo devuelve.\nSi no encuentra el valor (es decir, no ha sido insertado previamente), cuando llegue a una hoja termina la ejecución realizando\nun “Splay” de dicha hoja y devolviéndola.\n\n- El método borrar, inicialmente llama al método buscar (con lo que el nodo buscado o bien está en la raíz o bien no está).\nComprueba si el valor buscado (el de la raíz) es que el queríamos, si no es así, termino la ejecución y devuelvo que no lo ha\npodido borrar.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffernaper%2Fsplaytree","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffernaper%2Fsplaytree","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffernaper%2Fsplaytree/lists"}