Si tenemos los siguientes valores: 3, 5, 10, 15, 16, 20, 22, 23, 30, el resultado de la creación de este árbol se puede observar en la Figura B.2. Los valores almacenados en los nodos internos permiten guiar la búsqueda hacia los valores en las hojas. Todos los valores en el subárbol izquierdo de un determinado nodo contienen valores menores o iguales que el valor almacenado en dicho nodo, mientras que en el subárbol derecho estos valores son mayores.Algoritmo de creación de un árbol binario Alg_CAB
Entrada: Lista de valores ordenados L.
Salida: Nodo raíz del árbol creado T.
Si Longitud(L)=1 entonces /*Un único elemento*/
Crear un nuevo nodo N con V=Obtener_Elemento(L) y los punteros de los subárboles apuntando a un árbol vacío.
sino
Obtener el nodo cuyo valor es el central de la lista de valores (la mediana): vmed
Particionar la lista L en dos sublistas L1 y L2 de tal forma que L1 contiene todos los elementos menores o iguales a vmed y L2 los estrictamente mayores.
Crear un nuevo nodo N con V=vmed. El puntero izquierdo L apuntará al árbol devuelto en la llamada a la función Alg_CAB(L1) y el derecho R ídem Alg_CAB(L2).
FinSi
Devolver N.
El método de consulta parte de un determinado rango a buscar [x1:x2] y devuelve los puntos del árbol que se encuentran dentro de ese rango. El método se divide en dos fases: primero encontrar el nodo de partición para, a continuación, ir explorando a partir de este nodo e ir devolviendo los valores dentro del rango. Este nodo de partición (vpart) es aquel nodo del árbol cuyo valor es mayor que x1 y menor que x2, es decir se encuentra dentro del rango a buscar, y que además tiene menor profundidad (más próximo a la raíz). En la Figura B.2 se muestra el nodo de partición para un rango de búsqueda de [4:15]. La Figura B.3 muestra el resultado de buscar un determinado rango en el árbol binario. Primero encontramos el nodo de partición. Después buscamos por el hijo izquierdo, quedándonos con los subárboles derechos que se encuentren dentro del rango, mientras que cuando buscamos por el hijo derecho nos quedamos con los subárboles izquierdos. En la Figura B.5 se detalla el método de consulta de rango.
![]()
La función Devolver_Subárbol() devuelve una lista con todos los puntos que pertenecen al árbol pasado como parámetro a la función.
![]()
En cuanto a la consulta, el algoritmo también es muy similar al descrito para consulta en árboles binarios. Se realiza una consulta sobre las coordenadas x del árbol, y cuando se llamaba a la función Devolver_Subárbol ahora se debe realizar una consulta al árbol asociado con el rango de las y.
![]()
Algoritmo de consulta en un árbol binario Alg_CoAB
Entrada: Un árbol T y un rango de búsqueda [x1:x2]
Salida: Lista de puntos del árbol que se encuentran dentro del rango.
Crear una lista vacía Lista
vpart=raíz( T)
xpart=valor(vpart)
mientras vpart no es hoja y (x2 £ xpart o x1 > xpart) hacer
Si x2 £ xpart entonces
vpart=Hijo_izquierdo(vpart)
sino
vpart=Hijo_derecho(vpart)
FinSi
xpart=valor(vpart)
FinMientrasSi vpart es hoja entonces
Si (xpart ³ x1 y xpart £ x2) entonces Insertar xpart en Lista FinSi
sino
/* Primero se sigue el camino de la izquierda */
v=vpart
v=Hijo_izquierdo(v)
mientras v no es hoja hacer
xv=valor(v)
Si x1 £ xv entonces
Concatenar (Lista, Devolver_Subárbol(Hijo_derecho(v)))
v=Hijo_izquierdo(v)
sino
v=Hijo_derecho(v)
FinSi
FinMientras
/* El nodo hoja también debe de ser chequeado */
Si (xv ³ x1 y xv £ x2) entonces Insertar xv en Lista FinSi
/* Ahora se continúa por la derecha */
v=vpart
v=Hijo_derecho(v)
mientras v no es hoja hacer
xv=valor(v)
Si x2 ³ xv entonces
Concatenar (Lista, Devolver_Subárbol(Hijo_izquierdo(v)))
v=Hijo_derecho(v)
sino
v=Hijo_izquierdo(v)
FinSi
FinMientras
/* El nodo hoja también debe de ser chequeado */
Si (xv ³ x1 y xv £ x2) entonces Insertar xv en Lista FinSi
FinSi
Devolver Lista