Implementación de Árbol Binario de Búsqueda (ABB) auto-balanceado.
Usa templates.
Puedes crear un nuevo árbol de dos formas:
- Árbol vacío
Tree<T>()
- Árbol con nodo inicial y valor
n
Tree<T>(T n)
Y después, puedes insertar nodos en tu árbol tree.insert(T n)
Para imprimir los nodos ordenados, debes usar la función
tree.inOrder()
Si estás usando una clase o estructura personalizada, necesitas sobrecargar los operadores binarios (<, ==), y tener un constructor vacío.
Ya he definido dos constantes: Cuando el nodo no tiene padre (NOPARENT) y cuando el nodo es raíz(NOTIMES).
#define NOPARENT -201
#define NOTIMES -202
Propongo además, valores diferentes, para cuando necesites usar -201 o -202.
#define NOPARENT -45618540
#define NOTIMES -45093591
Esta es la lista de todas las funciones incluidas en la biblioteca. Todas las funciones trabajan en el nodo actual, a menos que se indique lo contrario.
friend int getNodeHeight(Tree<T> *node)
: Devuelve la altura del nodo
o -1
si el nodo está vacío.
T const &getData()
: Devuelve el dato.
int getTimes()
: Devuelve cuantas veces introdujiste el mismo valor
en el árbol. Por ejemplo, si introdujiste el número 3
dos veces,
entonces el nodo con data = 3
también tiene times = 2
.
bool hasParent()
: Devuelve verdadero si el nodo no es el nodo raíz.
int getHeight()
: Devuelve la altura.
int getNumberOfChildren()
: Devuelve el número total de hijos.
Tree<T> *getParent()
: Devuelve un apuntador al padre.
Tree<T> *getLeftChild()
: Devuelve un apuntador al hijo izquierdo.
Tree<T> *getRightChild()
: Devuelve un apuntador al hijo derecho.
Tree<T> *insert(T n)
: Inserta un nuevo nodo con valor n
.
Tree<T> *insert(Tree<T> *&node, T n)
: Inserta un nuevo nodo en
nodo
con valor n
;
Tree<T> *remove(T n)
: Elimina el nodo con valor n
.
Tree<T> *remove(Tree<T> *&node)
: Elimina este node
.
void updateNumberOfChidren()
: Actualiza el número de hijos en sus
ancestros.
void AVLcondition()
: Revisa si el subárbol cumple con la condición
AVL y rota los nodos necesarios para conseguirlo.
bool isAVLComplete()
: Devuelve verdadero si el subárbol cumple con
la condición AVL.
void updateHeight()
: Actualiza la altura de sus ancestros.
void rightRotation()
: Rota el nodo a la derecha.
Ejemplo:
x y
/ \ / \
y C a A x
/ \ / \
A B B C
void leftRotation()
: Rota el nodo a la izquierda.
Ejemplo:
x y
/ \ / \
A y a x C
/ \ / \
B C A B
Tree<T> *find(T key)
: Devuelve el nodo con data = key
o
nullptr
si no está presente.
std::string pathToRoot()
: Devuelve el camino hacia la raíz.
std::string longestHeight()
: Devuelve la altura más grande (camino
hacia el descendiente más lejano).
std::string preOrder()
: Devuelve el árbol en 'pre-order'.
std::string inOrder()
: Devuelve el árbol en 'in-order'.
std::string postOrder()
: Devuelve el árbol en 'post-order'.
std::string parents()
: Devuelve todos los nodos con su padre
inmediato.
std::string specs()
: Devuelve la siguiente información del nodo:
- Data (Dato)
- Path to root (Ruta hacia la raíz)
- Times (Veces que aparece)
- Height (Altura)
- Children (Número de hijos)
- Left child (Valor de nodo izquierdo)
- Right child (Valor de nodo derecho)
- Predecessor (Predecesor)
- Successor (Sucesor)
Tree<T> *findMinimum()
: Devuelve el valor mínimo en el árbol.
Tree<T> *findMaximum()
: Devuelve el valor máximo en el árbol.
Tree<T> *findPredecessor()
: Devuelve el predecesor.
Tree<T> *findSuccessor()
: Devuelve el sucesor.
bool isLeaf()
: Devuelve verdadero si el nodo es hoja (no tiene
hijos).
std::string levelOrder()
: Devuelve el recorrido por orden de nivel
del árbol en forma de cadena.
std::string givenLevel(int level)
: Devuelve el nivel del arbol en
forma de cadena.