INTRODUCCIÓN

El siguiente trabajo trata sobre la estructura de datos no lineales llamada árbol. Esta estructura se usa principalmente para representar datos con una relación jerárquica entre sus elementos, como por ejemplo registros, árboles genealógicos, y tablas de contenidos. Vamos a profundizar en un tipo especial de árbol llamado árbol binario, la cual puede ser implementado fácilmente en la computadora; aunque en un árbol puede parecer muy restrictivo. También se va a ampliar sobre árboles más generales y puntos con relación a los árboles binarios; entre estos tenemos a la terminología, los árboles binarios complementos, árboles binarios de búsqueda, búsqueda e inserción en árboles binarios de búsqueda, árboles generales, representación de árboles generales en la computadora y correspondencia entre los árboles generales y árboles binarios.

CONCEPTO DE ÁRBOLES
En ciencias de la computación, un árbol es una estructura de datos ampliamente usada que emula la forma de un árbol (un conjunto de nodos conectados). Un nodo es la unidad sobre la que se construye el árbol y puede tener cero o mas nodos hijos conectados a él. Se dice que un nodo a es padre de un nodo b, si existe un enlace desde a hasta b (en ese caso, también decimos que b es hijo de a). Sólo puede haber un único nodo sin padres, que llamaremos raíz. Un nodo que no tiene hijos se conoce como hoja. El árbol También se define como una estructura de datos no lineal. Esta estructura se usa principalmente para representar datos con una relación jerárquica entre sus elementos, como por ejemplo registros, árboles genealógicos y tablas de contenidos. Entre otros tenemos un tipo especial de de árbol que es, llamado árbol binario, que puede ser implementado fácilmente en la computadora.

DEFINICIÓN
Formalmente, podemos definir un árbol de la siguiente forma: Caso base: un árbol con sólo un nodo (es a la vez raíz del árbol y hoja).

Un

nuevo

árbol

a

partir

de

un

nodo nr y k árboles

de

raíces con elementos cada uno, puede construirse estableciendo una relación padre-hijo entre nr y cada una de las raíces de los k árboles. El árbol resultante de nodos tiene como raíz el nodo nr, los nodos son los hijos de nr y el conjunto de nodos hoja está formado por la unión de los k conjuntos hojas iniciales. A cada uno de los árboles Ai se les denota ahora subárboles de la raíz. Una sucesión de nodos del árbol, de forma que entre cada dos nodos consecutivos de la sucesión haya una relación de parentesco, decimos que es un recorrido árbol. Existen dos recorridos típicos para listar los nodos de un árbol: primero en profundidad y primero en anchura. En el primer caso, se listan los nodos expandiendo el hijo actual de cada nodo hasta llegar a una hoja, donde se vuelve al nodo anterior probando por el siguiente hijo y así sucesivamente. En el segundo, por su parte, antes de listar los nodos de nivel n + 1 (a distancia n + 1aristas de la raíz), se deben haber listado todos los de nivel n. Otros recorridos típicos del árbol son preorden, postorden e inorden:

El recorrido en preorden, también llamado orden previo consiste en recorrer en primer lugar la raíz y luego cada uno de los hijos en orden previo. El recorrido en inorden, también llamado orden simétrico (aunque este nombre sólo cobra significado en los árboles binarios) consiste en recorrer en primer lugar A1, luego la raíz y luego cada uno de los hijos simétrico. en orden

El recorrido en postorden, también llamado orden posterior consiste en recorrer en primer lugar cada uno de los hijos la raíz. en orden posterior y por último

Finalmente, puede decirse que esta estructura es una representación del concepto de árbol en teoría de grafos. Un árbol es un grafo conexo.

FORMAS DE REPRESENTACIÓN
• Mediante un grafo:

Mediante un diagrama encolumnado:

a b d c e f
En la computación se utiliza mucho una estructura de datos, que son los árboles binarios. Estos árboles tienen 0, 1 ó 2 descendientes como máximo. El árbol de la figura anterior es un ejemplo válido de árbol binario.

NOMENCLATURA SOBRE ÁRBOLES • • • • • • •
Vértices: Los puntos de la gráfica. Arista: Líneas que conectan a los vértices. Trayectoria o ruta: Camino por el cual se viaja de un vértice a otro a través de una arista. Lazo: Arista que incide en un mismo vértice. Gráfica: Una gráfica consiste en un conjunto de vértices y un conjunto de aristas tal que cada arista se asocia con un par no ordenado de vértices. Aristas Paralelas: Diferentes aristas que se asocian con el mismo par de vértices. Vértice aislado: Vértice en el que no incide ninguna arista.

Raíz: es aquel elemento que no tiene antecesor Rama: arista entre dos nodos. Nivel: número de ramas que hay que recorrer para llegar de la raíz a un nodo. Grado de un nodo: el número de descendientes directos que tiene. en las implementaciones sobre un computador que se realizan a continuación es necesaria una jerarquía. Nodo interno: aquel que tiene al menos un descendiente. Antecesor: un nodo X es antecesor de un nodo Y si por alguna de las ramas de X se puede llegar a Y. Hoja: nodo que no tiene descendientes: grado 0. TIPOS DE ÁRBOLES • • • • Árboles Binarios Árbol de búsqueda binario auto-balanceable • Árboles AVL • Árboles Rojo-Negro • Árbol AA Árboles B • Árbol-B+ • Árbol-B* Árboles Multicamino . basta con girar el árbol.• • • • • • • • • • • Gráfica Simple: Es una gráfica sin lazos ni aristas paralelas. y a y d los sucesores inmediatos de la raíz b. Sin embargo. Sucesor: un nodo X es sucesor de un nodo Y si por alguna de las ramas de Y se puede llegar a X. Anchura: es el mayor valor del número de nodos que hay en un nivel. pero se puede observar según la figura que cualquier nodo podría ser considerado raíz. Altura: el nivel más alto del árbol. que haya una única raíz. es decir. Podría determinarse por ejemplo que b fuera la raíz. Aclaraciones: se ha denominado a a la raíz.

y el subárbol derecho de A consiste en los nodos C . J.F. Los nodos A. y análogamente. respectivamente. ya que T se define en términos de los subárboles binarios T1 y T2. Los árboles se dice que son copias si son similares y tienen los mismos contenidos en sus correspondientes nodos. TIPOS DE ÁRBOLES BINARIOS 1. si T2 no es vació. 2. Esto significa. en particular. K y L. Los nodos sin sucesores se llaman nodos terminales. en otras palabras. ambos árboles están vacíos. E y F. Si T1 no es vació. y los nodos D.C y H tienen dos sucesores. Observe que: • • B es un sucesor izquierdo y C un sucesor derecho del nodo A. y los restantes nodos de T forman un par ordenado de árboles binarios disjuntos T1 y T2. Dos árboles binarios T y T’ se dicen que son similares si tienen la misma estructura o. G. Cualquier nodo N de un árbol binario T tiene 0. de forma que: • • • T es vacío ( en cuyo caso se llama árbol nulo o árbol vació) o T contiene un nodo distinguido R. Un árbol binario lleno es un árbol en el que cada nodo tiene cero o dos hijos. . si tienen la misma forma. Más aun. llamados nodos. 1 ó 2 sucesores. si N es un nodo terminal. D. los nodos R y J sólo tienen un sucesor . subárboles izquierdo y derecho de la raíz R. H. su raíz se llama sucesor derecho de R. los dos árboles T1 y T2 se llaman. La definición anterior del árbol binario T es recursiva.B. El subárbol izquierdo de la raíz A consiste en los nodos B. que cada nodo N de T contiene un subárbol izquierdo y uno derecho. entonces su raíz se llama sucesor izquierdo de R. Si T contiene una raíz R.L y K no tienen sucesores. G.ÁRBOLES BINARIOS Un árbol binario T se define como un conjunto finito de elementos. llamado raíz de T. Un árbol binario es un árbol con raíz en el que cada nodo tiene como máximo dos hijos.

3. Un árbol binario es un árbol en el que ningún nodo puede tener más de dos subárboles. suponga que N es un nodo de T con un sucesor izquierdo S1 y un sucesor derecho S2. S 2. En particular. Dos árboles binarios T y T’ se dice que son similares si tienen la misma estructura o . El termino "árbol" aparece. Aquí asumimos que nuestro árbol . A la raíz R del árbol T se le asigna el numero de nivel 0. TERMINOLOGÍA Frecuentemente se usa una terminología de relaciones familiares para describir las relaciones entre los nodos de un árbol T. En un árbol binario cada nodo puede tener cero. con significados ligeramente diferentes. y al resto de los nodos se le asigna un numero de nivel que es mayor en 1 que el numero de nivel de su padre. 5. Equivale a 1 más que el mayor numero de nivel de T. También se usa esa terminología de teoría de grafos y de horticultura para un árbol binario T. tiene un único padre. Se conoce el nodo de la izquierda como hijo izquierdo y el nodo de la derecha como hijo derecho. S m. y una secuencia de aristas consecutivas se denomina camino. Cada nodo de un árbol binario T tiene asignado un número de nivel. en muchas áreas diferentes de las matemáticas y de la informática. Un nodo terminal se llama hoja y un camino que termina en una hoja se llama rama. Un árbol binario perfecto es un árbol binario lleno en el que todas las hojas (vértices con cero hijos) están a la misma profundidad (distancia desde la raíz. si tienen la misma forma. L se dice descendiente izquierdo o derecho de N dependiendo de si pertenece al subárbol izquierdo o al derecho de N. Los árboles se dice que son copias si son similares y tienen los mismos contenidos en sus correspondientes nodos. S1 se llama el hijo izquierdo de N y S2 el hijo derecho de N. Análogamente. Los términos descendientes y antecesores tienen su significado usual. de la forma que sigue. Más aun. llamado predecesor de N. de teoría de grafos y horticultura se usa para los árboles generales de la misma forma que para los árboles binarios. En particular. aquellos nodos con el mismo número de nivel se dice que pertenecen a la misma generación. Entonces N se llama padre de S1 y S2. los S i son hijos de N y los S i son hermanos unos de otros. también llamada altura). A veces un árbol binario perfecto es denominado árbol binario completo. Es mas. específicamente. 4. La terminología de relaciones familiares.…. si N es un nodo con sucesores S 1. uno o dos hijos (subárboles). Otros definen un árbol binario completo como un árbol binario lleno en el que todas las hojas están a profundidad n o n-1. La profundidad o altura (o altura) de un árbol T es el número máximo de nodos de una rama de T. la línea dibujada entre un nodo N de T y un sucesor suyo se llama arista. un nodo L se dice descendiente de un nodo N (y N se dice antecesor de L) si existe una sucesión de hijos desde N hasta L. en otras palabras. excepto la raíz. para alguna n. S1 y S2 se dice que son hermanos. Así. se dice que N es el padre de los S i . Cada nodo N de un árbol binario T. En particular.

3. y que T esta ordenado. 2. El árbol binario T se dice que es completo si todos sus niveles.M.G. A. tienen el máximo numero de nodos posibles y si todos lo9s nodos del ultimo nivel están situados. EJEMPLO: La figura muestra un árbol general T con 13 nodos. A menos que se diga lo contrario. T se mantendrá en memoria en términos de una representación enlazada que usa tres arrays paralelos. Estas dos propiedades no se requieren siempre para definir un árbol. . Los nodos E. la raíz de un árbol T es el nodo en lo alto del diagrama.H.J. Cada uno de los nodos D y H tiene un hijo. solo existe un único árbol completo Tn con exactamente n nodos. el primer hijo B. A es la raíz de T y A tiene tres hijos. que T tiene un nodo distinguido R llamado raíz de T. Entonces el hijo se distingue por ser el izquierdo o el derecho en un árbol binario T’. Así.G. y los hijos de un nodo están ordenados de izquierda a derecha.C. ÁRBOLES BINARIOS COMPLETOS: Considere un árbol binario T.J. Las dos diferencias básicas son: • • Un árbol binario T’ puede estar vació. Cada uno de los nodos B y K tienen dos hijos. Representación de los árboles generales en la computadora. pero un árbol general T no es vació.M y N no tienen hijos. Así.F.F.K. Suponga que un nodo N tiene un solo hijo.L.N A menos de que se indique lo contrario. ósea. El último grupo de nodos.E. Lo más posible a la izquierda. El nodo C tiene tres hijos. los que no tienen hijos.B.D. Suponga que T es un árbol general. se llaman nodos terminales. que los hijos de cada nodo N de T tienen un orden especifico. 4. mientras que no existe esa distinción en un árbol general T. el segundo C y el tercero D. se observa que: 1.L. Un árbol binario T’ no es un caso especial de un árbol general T: los árboles binarios y los árboles generales son dos cosas distintas. excepto posiblemente el ultimo. es decir.general T esta enraizado.

cada nodo N de T corresponderá a una posición K tal que: 1. se hace HIJO [3]:= 15. HERM [ K ] contiene la posición del siguiente hermano de N. hijo. Y así sucesivamente. guardado en INFO [3 ]. HIJO. suponga que los datos de los nodos de T se guardan en un Array INFO como en la figura (3) las relaciones estructurales de T se obtienen asignando valores al puntero RAIZ y a los Arrays HIJO y HERM tal y como sigue: 1. HIJO [ K ] contiene la posición del primer hijo de N. Como el primer hijo de B es el nodo E. como la raíz A de T se guarda en INFO [ 2 ]. 2. (o ABAJO) Y HERM (u HORIZ). y una variable puntero RAIZ.INFO. En primer lugar. tal como sigue. 2. INFO [ K ] contiene los datos del nodo N. Como el primer hijo de A es el nodo B. como el nodo C es el siguiente hermano de B y C se guarda en INFO [ 4 ]. se hace HERM [3]:=4. se hace HIJO [ 2 ]:= 3. se y hace RAIZ:= 2. guardado en INFO [ 15 ]. como A no tiene hermanos. donde DISP = 1. La condición HERM [ K ] = NULO indica que N es el ultimo hijo de su padre. La figura (3) da los valores finales de HIJO y HERM. DECLARACIÓN DE ÁRBOL BINARIO . 3. se hace HERM [ 2 ]= NULO. EJEMPLO: Considere el árbol general T de la figura (2) . Observe que la lista DISP de nodos vacos se mantiene en el primer array. 3. La condición HIJO [ K ]= NULO indica que N no tiene hijos.

e.d. void inorden(tarbol *a) { if (a != NULL) { inorden(a->izq). Es un proceso recursivo por naturaleza. struct tarbol *izq. } tarbol. visitar(a). visitar el subárbol derecho. Puesto que los árboles no son secuenciales como las listas.d. } } .a. } } • Recorrido en inorden u orden central: se visita el subárbol izquierdo. void preorden(tarbol *a) { if (a != NULL) { visitar(a). pero no se estudiarán aquí.e. hay que buscar estrategias alternativas para visitar todos los nodos.f. preorden(a->izq). inorden(a->der). y después se visita el subárbol derecho. Para representar los enlaces con los hijos se utilizan punteros. Un árbol binario puede declararse de la siguiente manera: typedef struct tarbol { int clave. RECORRIDOS SOBRE ÁRBOLES BINARIOS Se consideran dos tipos de recorrido: recorrido en profundidad y recorrido en anchura o a nivel. y después visitar el subárbol izquierdo y una vez visitado.c. Si se hace el recorrido en preorden del árbol de la figura 1 las visitas serían en el orden siguiente: a.c.Se definirá el árbol con una clave de tipo entero (puede ser cualquier otra tipo de datos) y dos hijos: izquierdo (izq) y derecho (der). Otras declaraciones también añaden un enlace al nodo padre. preorden(a->der). En el ejemplo de la figura 1 las visitas serían en este orden: b. El árbol vacío se representará con un puntero nulo.f.b. el nodo actual. Recorridos en profundidad: • • Recorrido en preorden: consiste en visitar el nodo actual (visitar puede ser simplemente mostrar la clave del nodo por pantalla).*der.

} } .a. postorden(a->der).c. Una alternativa es utilizar una variable auxiliar. aux->der).f En este caso el recorrido no se realizará de forma recursiva sino iterativa. aux).f. En el ejemplo de la figura 1 el recorrido quedaría así: d. porque al borrarlo se pueden perder los enlaces. después el subárbol derecho. utilizando una cola (ver Colas) como estructura de datos auxiliar. a). Recorrido en amplitud: Consiste en ir visitando el árbol por niveles. así hasta que ya no queden más. Si se hace el recorrido en amplitud del árbol de la figura una visitaría los nodos en este orden: a. while (!colavacia(cola)) { desencolar(cola.b. y aunque no se perdieran se rompe con la regla de manipular una estructura de datos inexistente. void amplitud(tarbol *a) { tCola cola.c. En la codificación que viene a continuación no se implementan las operaciones sobre colas. y seguir desencolando y encolando hasta que la cola esté vacía.e. y por último el nodo actual. Es decir. encolar(cola. if (aux->der != NULL) encolar(cola. después los nodos de nivel 2. if (a != NULL) { CrearCola(cola). La razón para hacer esto es que no se debe borrar un nodo y después sus subárboles.b. Primero se visitan los nodos de nivel 1 (como mucho hay uno. aux->izq). pero es innecesario aplicando este recorrido. la raíz). visitar(aux). if (aux->izq != NULL) encolar(cola. si visitar se traduce por borrar el nodo actual. El procedimiento consiste en encolar (si no están vacíos) los subárboles izquierdo y derecho del nodo extraido de la cola.• Recorrido en postorden: se visitan primero el subárbol izquierdo. visitar(a). /* las claves de la cola serán de tipo árbol binario */ arbol *aux. void postorden(arbol *a) { if (a != NULL) { postorden(a->izq). al ejecutar este recorrido se borrará el árbol o subárbol que se pasa como parámetro.d.e. } } La ventaja del recorrido en postorden es que permite borrar el árbol de forma consistente.

Antes de explicarlo se recomienda al lector que lo intente hacer por su cuenta. Por tanto se tiene este árbol: A continuación comienza un proceso recursivo.} Por último. A continuación se estudia un método para crear un árbol binario que no tenga claves repetidas partiendo de su recorrido en preorden e inorden. Ese elemento se busca en el array inorden. considérese la sustitución de la cola por una pila en el recorrido en amplitud. ¿Qué tipo de recorrido se obtiene? CONSTRUCCIÓN DE UN ÁRBOL BINARIO Hasta el momento se ha visto la declaración y recorrido de un árbol binario. cuyo tamaño está limitado por los índices izq y der. Se procede a crear el subárbol izquierdo. Sin embargo no se ha estudiado ningún método para crearlos. Partiendo de los recorridos preorden e inorden del árbol de la figura 1 puede determinarse que la raíz es el primer elemento del recorrido en preorden. Queda esto: . es sencillo cuando uno es capaz de construir el árbol viendo sus recorridos pero sin haber visto el árbol terminado. almacenados en sendos arrays. Los elementos en el array inorden entre izq y la raíz forman el subárbol izquierdo. Asimismo los elementos entre der y la raíz forman el subárbol derecho. La siguiente posición en el recorrido en preorden es la raíz de este subárbol.

ÁRBOL BINARIO DE BÚSQUEDA: Un árbol binario de búsqueda es aquel que es: • • Una estructura vacía o Un elemento o clave de información (nodo) más un número finito -a lo sumo dosde estructuras tipo árbol.El subárbol b tiene un subárbol derecho. que no tiene ningún descendiente. Ambos subárboles son árboles binarios de búsqueda. disjuntos. puesto que b no tiene subárbol izquierdo: Después seguirá construyéndose el subárbol derecho a partir de la raíz a. tal y como indican los índices izq y der. Todas las claves del subárbol derecho al nodo son mayores que la clave del nodo. llamados subárboles y además cumplen lo siguiente: Todas las claves del subárbol izquierdo al nodo son menores que la clave del nodo. Se ha obtenido el subárbol izquierdo completo de la raíz a. • • • Un ejemplo de árbol binario de búsqueda: . La implementación de la construcción de un árbol partiendo de los recorridos en preorden y en inorden puede consultarseaquí (en C).

suponer que el tipo de datos de la clave es un puntero (da igual a lo que apunte). Si se codifica el árbol en Pascal no se puede establecer una relación de orden para las claves. Si el árbol está perfectamente equilibrado -esto es. Dada la raíz 4. insertar la clave 7 en el árbol de la figura 5 requiere avanzar por el árbol hasta llegar a la clave 8. el algoritmo de inserción en un árbol binario de búsqueda tiene la ventaja -sobre los arrays ordenados.2. las claves del subárbol izquierdo son menores que 4. por ejemplo. reduciendo drásticamente su eficacia para localizar un elemento. pero más eficiente que el de borrado en un array ordenado.entonces el número de comparaciones necesarias para localizar una clave es aproximadamente de logN en el peor caso.6.3. para todos los nodos. Si las claves a introducir llegan de forma más o menos aleatoria entonces la implementación de . suponer que se tiene un árbol vacío. Ahora bien. Por ejemplo. Cuestión: ¿Qué hay que hacer para obtener una lista de los números ordenada de mayor a menor? Una ventaja fundamental de los árboles de búsqueda es que son en general mucho más rápidos para localizar un elemento que una lista enlazada. Ejemplo: 1. Continuando las inserciones se ve que el árbol degenera en una lista secuencial. la diferencia entre el número de nodos del subárbol izquierdo y el número de nodos del subárbol derecho es a lo sumo 1. donde se emplearía búsqueda dicotómica para localizar un elemento. Se crea un árbol cuya raíz tiene la clave 1. hasta encontrar su ubicación. Si se hace el recorrido de este árbol en orden central se obtiene una lista de los números ordenada de menor a mayor. Por tanto. que admite claves de tipo entero.5. Además.Al definir el tipo de datos que representa la clave de un nodo dentro de un árbol binario de búsqueda es necesario que en dicho tipo se pueda establecer una relación de orden. puesto que Pascal no admite determinar si un puntero es mayor o menor que otro. En el ejemplo de la figura 5 las claves son números enteros.4. A continuación se inserta la clave 3 en el subárbol derecho de 2. e introducir la nueva clave en el subárbol izquierdo a 8. De todas formas es poco probable que se de un caso de este tipo en la práctica. Se inserta la clave 2 en el subárbol derecho de 1. Esto se cumple también para todos los subárboles. y las claves del subárbol derecho son mayores que 4.de que no necesita hacer una reubicación de los elementos de la estructura para que esta siga ordenada después de la inserción. El algoritmo de borrado en árboles es algo más complejo. son más rápidos para insertar y borrar elementos. Dicho algoritmo funciona avanzando por el árbol escogiendo la rama izquierda o derecha en función de la clave que se inserta y la clave del nodo actual. Suponer que se van a ir introduciendo las claves de forma ascendente.

que sin llegar a cumplir al 100% el criterio de árbol perfectamente equilibrado. El resultado es idéntico al de una búsqueda secuencial. int elem) { if (a == NULL) return FALSE. else if (a->clave > elem) return buscar(a->izq. Es más. es necesario emplear uno de los recorridos anteriores sobre el árbol para localizarlo. elem). Aprovechando las propiedades del árbol de búsqueda se puede acelerar la localización. else if (a->clave < elem) return buscar(a->der. (*a)->clave = elem. Se recuerda que el árbol debe seguir siendo de búsqueda tras el borrado. elem). else return TRUE.operaciones sobre un árbol binario de búsqueda que vienen a continuación son en general suficientes. Cuando se llega a un árbol vacío se crea el nodo en el puntero que se pasa como parámetro por referencia. Si el elemento a insertar ya existe entonces no se hace nada. else if ((*a)->clave > elem) insertar(&(*a)->izq. una vez encontrado el nodo a borrar: 1. Existen variaciones sobre estos árboles. } else if ((*a)->clave < elem) insertar(&(*a)->der. } • Inserción La inserción tampoco es complicada. evitan problemas como el de obtener una lista degenerada. de esta manera los nuevos enlaces mantienen la coherencia. El nodo no tiene descendientes. Pueden darse tres casos. Simplemente se borra. boolean buscar(tarbol *a. OPERACIONES BÁSICAS SOBRE ÁRBOLES BINARIOS DE BÚSQUEDA • Búsqueda Si el árbol no es de búsqueda. (*a)->izq = (*a)->der = NULL. int elem) { if (*a == NULL) { *a = (arbol *) malloc(sizeof(arbol)). . elem). Simplemente hay que descender a lo largo del árbol a izquierda o derecha dependiendo del elemento que se busca. resulta prácticamente idéntica a la búsqueda. void insertar(tarbol **a. elem). como los AVL o Red-Black (no se tratan aquí). } • Borrado La operación de borrado si resulta ser algo más complicada.

El algoritmo de borrado que se implementa a continuación realiza la sustitución por la mayor de las claves menores. y después avanzar siempre a la derecha hasta encontrar un nodo hoja. La menor de las claves mayores al nodo que se borra. ¿Puede ser cualquier hoja? No. y su primer descendiente se asigna como hijo del padre del nodo borrado. Suponer que se quiere borrar el nodo 4 del árbol de la figura 5.2. Para lograr esto es necesario descender primero a la izquierda del nodo que se va a borrar. además de seguir manteniendo la estructura como un árbol binario de búsqueda. (aunque se puede escoger la otra opción sin pérdida de generalidad). debe ser la que contenga una de estas dos claves: • • La mayor de las claves menores al nodo que se borra. Al borrar dicho nodo es necesario mantener la coherencia de los enlaces. Suponer que se quiere borrar el nodo 4 del árbol de la figura 5. Se borra dicho nodo. A continuación se muestra gráficamente el proceso de borrar el nodo de clave 4: . Ejemplo: en el árbol de la figura 5 se borra el nodo cuya clave es – El árbol resultante es: El nodo tiene al menos un descendiente por cada rama. y borrar a continuación dicha hoja. Se sustituirá la clave 4 por la clave 2. La solución consiste en sustituir la información del nodo que se borra por el de una de las hojas. Se sustituirá la clave 4 por la clave 5. El nodo tiene al menos un descendiente por una sola rama.

o el número de niveles de nodos bajo la raíz. Mantener baja la altura se consigue habitualmente realizando transformaciones en el árbol. ÁRBOL BINARIO DE BÚSQUEDA AUTO-BALANCEABLE En ciencias de la computación. como cuando las claves son insertadas en orden. void borrar(tarbol **a. /* se sustituye por la mayor de las menores */ } } free(aux). else sustituir(&(*a)->izq. tarbol **aux). else if ((*a)->der == NULL) *a = (*a)->izq. elem). Tiempos para varias operaciones en términos del número de nodos en el árbol n: Operación Búsqueda Inserción Eliminación Iteración en orden Tiempo en cota superior asintótica O(log n) O(log n) O(log n) O(n) . else if ((*a)->clave == elem) { aux = *a. if (*a == NULL) /* no existe la clave */ return. automáticamente. tarbol *aux. elem). if ((*a)->clave < elem) borrar(&(*a)->der. ya que muchas operaciones en un árbol de búsqueda binaria tardan un tiempo proporcional a la altura del árbol. &aux). tan pequeños como sea posible en todo momento. en momentos clave. int elem) { void sustituir(tarbol **a. else if ((*a)->clave > elem) borrar(&(*a)->izq. y los árboles binarios de búsqueda ordinarios pueden tomar alturas muy grandes en situaciones normales. un árbol binario de búsqueda autobalanceable o equilibrado es un árbol binario de búsqueda que intenta mantener su altura. como la rotación de árboles.Codificación: el procedimiento sustituir es el que desciende por el árbol cuando se da el caso del nodo con descencientes por ambas ramas. if ((*a)->izq == NULL) *a = (*a)->der. Esto es importante.

2. Así. En los árboles rojo-negro las hojas no son relevantes y no contienen datos. La raíz es negra. También es llamada "Propiedad del camino". En los árboles rojo-negro. PROPIEDADES Un ejemplo de árbol rojo-negro Un árbol rojo-negro es un árbol binario de búsqueda en el que cada nodo tiene un atributo de color cuyo valor es o bien rojo o bien negro. se deben satisfacer los siguientes para tener un árbol rojo-negro válido: 1. para ahorrar memoria. como en todos los árboles binarios de búsqueda. ya sea contando siempre los nodos negros nulos. mientras que para otras están amortizados. o bien no contándolos nunca (el resultado es equivalente). 5. todas las referencias de los nodos internos a las hojas van a parar al nodo centinela.Para algunas implementaciones estos tiempos son el peor caso. TERMINOLOGÍA Un árbol rojo-negro es un tipo especial de árbol binario usado en informática para organizar información compuesta por datos comparables (como por ejemplo números). y por tanto el camino no puede tener dos rojos seguidos. A la hora de implementarlo en un lenguaje de programación. Los hijos de todo nodo rojo son negros (también llamada "Propiedad del rojo"). se le denomina "Altura negra del árbol". es posible moverse ordenadamente a través de los elementos de forma eficiente si hay forma de localizar el padre de cualquier nodo. Además de los requisitos impuestos a los árboles binarios de búsqueda convencionales. Todas las hojas son negras (las hojas son los hijos nulos). El tiempo de desplazarse desde la raíz hasta una hoja a través de un árbol equilibrado que tiene la mínima altura posible es de O(log n). que es constante para todos los caminos. . 4. un único nodo (nodo-centinela) hace de nodo hoja para todas las ramas. Cada camino simple desde un nodo a una hoja descendiente contiene el mismo número de nodos negros. Todo nodo es o bien rojo o bien negro. y al número de nodos negros de cada camino. 3.

Como consecuencia de esto todos los nodos internos tienen dos hijos. basta ver que ningún camino puede tener 2 nodos rojos seguidos debido a la propiedad 4. Los árboles rojo-negro son particularmente valiosos en programación funcional. sino que además son apreciados para la construcción de bloques en otras estructuras de datos que garantizan un peor caso. El resultado es que dicho árbol está aproximadamente equilibrado. Es posible presentar los árboles rojonegro en este paradigma. en lugar de nodos. La versión persistente del árbol rojo-negro requiere un espacio O(log n) para cada inserción o borrado. lo cual da como resultado un árbol que parece contradecir los principios expuestos antes. este artículo utilizan “hojas nulas”. En otras palabras. El camino más largo desde la raíz hasta una hoja no es más largo que 2 veces el camino más corto desde la raíz del árbol a una hoja en dicho árbol. esto muestra que no hay ningún camino que pueda tener el doble de longitud que otro camino. USOS Y VENTAJAS Los árboles rojo-negro ofrecen un peor caso con tiempo garantizado para la inserción. Por ejemplo. lo que provoca que la inserción y el borrado sean más lentos pero la búsqueda y la devolución del resultado de la misma más veloz. Por esta razón. donde son una de las estructuras de datos persistentes más comúnmente utilizadas en la construcción de arrays asociativos y conjuntos que pueden retener versiones previas tras mutaciones. como se mostró antes. pero cambian algunas de las propiedades y se complican los algoritmos. por la propiedad 5. En muchas presentaciones de estructuras arbóreas de datos. pero que realmente no los contradice. El camino más corto posible tiene todos sus nodos negros. esta cota superior de la altura permite a los árboles rojo-negro ser eficientes en el peor caso. Dado que las operaciones básicas como insertar. además del tiempo. muchas estructuras de datos usadas engeometría computacional pueden basarse en árboles rojo-negro. el borrado y la búsqueda. son coloreadas de color rojo o negro. inserción y borrado. es posible para un nodo tener solo un hijo y las hojas contienen información. El color de cada nodo en la terminología de este artículo corresponde al color de la arista que une el nodo a su padre. pero esto no produce ninguna diferencia. Los árboles rojo-negro son isométricos a los árboles 2-3-4. existe un árbol correspondiente rojo-negro con los datos en el mismo orden. Habitualmente estos nodos son omitidos en las representaciones. Otra explicación que se da del árbol rojo-negro es la tratarlo como un árbol binario de búsqueda cuyas aristas. que es siempre negra por la propiedad 2 donde la correspondiente arista no existe. Para ver que estas propiedades garantizan lo dicho. El árbol AVL es otro tipo de estructura con O(log n) tiempo de búsqueda. Como todos los caminos máximos tienen el mismo número de nodos negros. y el más largo alterna entre nodos rojos y negros. de forma contraria a lo que sucede en los árboles binarios de búsqueda. No es esto únicamente lo que los hace valiosos en aplicaciones sensibles al tiempo como las aplicaciones en tiempo real. excepto la raíz. Está equilibrado de forma más rígida que los árboles rojo-negro. aunque uno o ambos nodos podrían ser una hoja nula. para cada árbol 2-3-4. que no contienen información y simplemente sirven para indicar dónde el árbol acaba. La inserción y el borrado en árboles 2-3-4 son también equivalentes a los cambios de . borrar y encontrar valores tienen un peor tiempo de búsqueda proporcional a la altura del árbol.6.

Los árboles AA son una variación del árbol rojo-negro. En otras palabras. explicaremos su funcionamiento con palabras. Guibas y Robert Sedgewick realizado en 1978. Los algoritmos de mantenimiento para un árbol rojo-negro necesitan considerar siete diferentes formas para balancear adecuadamente el árbol: En un árbol AA.colores y las rotaciones en los árboles rojo-negro. los nodos rojos en un árbol AA sólo pueden añadirse como un hijo derecho. Esto los hace ser una herramienta útil para la comprensión del funcionamiento de los árboles rojo-negro y por esto muchos textos introductorios sobre algoritmos presentan los árboles 2-3-4 justo antes que los árboles rojo-negro. sólo es necesario considerar dos formas: ROTACIONES DE BALANCEO . que le dio el nombre de “árboles-B binarios simétricos”. y no aportaría nada. al cumplirse el estricto requisito de que sólo los enlaces derechos pueden ser rojos. aunque frecuentemente no sean utilizados en la práctica. Por tanto. Es complejo. Los árboles AA reciben el nombre de su inventor. Sería ideal exponer la especificación algebraica completa de este tipo abstracto de datos (TAD) escrita en algún lenguaje de especificación deTADs como podría ser Maude. La estructura original fue creada por Rudolf Bayer en 1972. De esta manera se simula un árbol 2-3 en lugar de un árbol 2-3-4. ÁRBOL ROJO-NEGRO Un árbol rojo negro es un tipo abstracto de datos. ningún nodo rojo puede ser un hijo izquierdo. lo que simplifica las operaciones de mantenimiento. una estructura de datosutilizada en informática y ciencias de la computación. pero tomó su nombre moderno en un trabajo de Leo J. concretamente es un árbol binario de búsqueda equilibrado. A diferencia de los árboles rojo-negro. pero tiene un buen peor caso de tiempo de ejecución para sus operaciones y es eficiente en la práctica. que a su vez es una mejora del árbol binario de búsqueda. insertar y borrar en un tiempo O(log n). ÁRBOL AA En informática un árbol AA es un tipo de árbol binario de búsqueda autobalanceable utilizado para almacenar y recuperar información ordenada de manera eficiente. la complejidad de la estructura hace que la especificación quede bastante ilegible. sin embargo. Puede buscar. esquemas e implementaciones de funciones en el lenguaje de programación C. Arne Andersson. donde n es el número de elementos del árbol.

Estas operaciones se llaman torsión (skew) y división (split). if nil(T) then . El nivel de un nodo hoja es uno. Cada nodo de nivel mayor que uno debe tener dos hijos. El nivel de un hijo derecho es menor o igual que el de su padre. puede pensarse como un enlace rojo izquierdo en el contexto del árbol rojo-negro. Cada nodo tiene un campo nivel y se deben cumplir las siguientes condiciones para que el árbol sea válido: 1. Sólo se necesitan dos operaciones para mantener el equilibrio en un árbol AA. function skew is input: T. La división es una rotación izquierda condicional que tiene lugar cuando una inserción o un borrado crea dos enlaces horizontales derechos. output: Another node representing the rebalanced AA tree. 5. a node representing an AA tree that needs to be rebalanced. La torsión es una rotación derecha que se realiza cuando una inserción o un borrado genera un enlace horizontal izquierdo. El nivel de un nieto derecho es estrictamente menor que el de su abuelo.En general. a node representing an AA tree that needs to be rebalanced. 4. output: Another node representing the rebalanced AA tree. 2. if nil(T) then return Nil else if level(left(T)) == level(T) then Swap the pointers of horizontal left links. L = left(T) left(T) := right(L) right(L) := T return L else return T end if end function Torsion: function split is input: T. 3. a diferencia de los árboles rojo-negro. El nivel de un hijo izquierdo es estrictamente menor que el de su padre. los árboles AA se implementan con la idea de un nivel en lugar de la de un color. lo que de nuevo se corresponde con dos enlaces rojos consecutivos en el contexto de los árboles rojo-negro.

return Nil else if level(T) == level(right(right(T))) then We have two horizontal right links. output: A balanced version T including X. y si aparecen dos enlaces horizontales derechos. Después. Nil. se realiza una división. 1. Take the middle node. return node(X. the root of the tree to insert it into. es fácil comprobar la validez del árbol y realizar las rotaciones que se precisen. posiblemente incrementando el nivel del nuevo nodo raíz del subárbol correspondiente. a medida que se desenrolla la pila de llamadas. if nil(T) then Create a new leaf node with X. the value to be inserted. Observe que el código de muestra realiza un incremento de nivel(T). se realiza una torsión. and T. Set the result of the recursive call to the correct child in case a new node was created or the root of the subtree changes. Lo que hace necesario continuar comprobando la validez del árbol a medida que las modificaciones suben desde las hojas. Do the normal binary tree insertion procedure. and return it. elevate it. R = right(T) right(T) := left(R) left(R) := T level(R) := level(R) + 1 return R else return T end if end function INSERCIÓN La inserción comienza con la búsqueda normal en un árbol binario y su procedimiento de inserción. Si aparece un enlace horizontal izquierdo. Nil) else if X < value(T) then . function insert is input: X.

el sucesor se puede encontrar al ir una vez a la derecha una vez y a la izquierda hasta que se encuentre un puntero nulo. Después. Torsionar el nivel. Dividir el nivel. 3. Esta aproximación se ha visto favorecida por el hecho de que se basa en tres pasos independientes y fáciles de entender: 1. As given. y se describirá aquí. Decrementar el nivel. function delete is . el nodo sucesor o predecesor tendrá nivel 1. aunque implementaciones reales pueden optar por un enfoque más optimizado. el primer paso para mantener la validez es reducir el nivel de todos los nodos cuyos hijos están dos niveles por debajo de ellos. Dada la propiedad de los árboles AA de que todos los nodos de un nivel superior a uno tienen dos hijos. or not a rotation will occur or not are inside of the procedures. Sin embargo. T := skew(T) T := split(T) return T end function The conditionals that determine whether BORRADO Como en la mayoría de árboles binarios balanceados. o a los que les faltan hijos. left(T)) else if X > value(T) then right(T) := insert(X. haciendo que su eliminado sea trivial.left(T) := insert(X. Para recuperar un predecesor simplemente se debe seguir un enlace izquierdo y después todos los enlaces derechos restantes. Para re-equilibrar un árbol existen diferentes aproximaciones. todo el nivel debe ser torsionado y dividido. dependiendo del que esté en el árbol o de los deseos del implementador. el borrado de un nodo interno puede convertirse en el borrado de un nodo hoja al intercambiar el nodo interno bien con su predecesor o sucesor más próximo. Tras un borrado. De forma similar. 2. The implementor may desire different behavior. si es necesario. debemos torsionar y dividir todo el nivel en lugar de un solo nodo lo que complica nuestro código. La que describió Andersson en su publicación original es la más simple. as given above. an insert will have no effect. Perform skew and then split. right(T)) end if Note that the case of X == value(T) is unspecified.

input: X. level(right(T))) + 1 if should_be < level(T) then level(T) := should_be if should_be < level(right(T)) then level(right(T)) := should_be end if end if return T end function . and T. output: T with its level decreased. and then skew and split all nodes in the new level. T := decrease_level(T) T := skew(T) right(T) := skew(right(T)) right(right(T)) := skew(right(right(T))) T := split(T) right(T) := split(right(T)) return T end function function decrease_level is input: T. the value to delete. output: T. a tree for which we want to remove links that skip levels. left(T)) value(T) := L end if end if Rebalance the tree. left(T)) else If we're a leaf. should_be = min(level(left(T)). right(T)) else if X < value(T) then left(T) := delete(X. easy. if leaf(T) then return Nil else if nil(left(T)) then L := successor(T) right(T) := delete(L. Decrease the level of all nodes in this level if necessary. right(T)) value(T) := L else L := predecessor(T) left(T) := delete(L. without the value X. otherwise reduce to leaf case. balanced. the root of the tree from which it should be deleted. if X > value(T) then right(T) := delete(X.

Un buen ejemplo de borrado por este algoritmo está presente en la publicación de Andersson. Para que siga manteniéndose el número de nodos dentro del rango predefinido. En las ciencias de la computación. y estos factores se compensan resultando en un rendimiento similar. en un árbol-B 23 (A menudo simplemente llamado árbol 2-3 ). Un árbol AA realiza más rotaciones que un árbol red-black. pero un árbol AA tiende a ser más llano lo que produce unos tiempos de búsqueda ligeramente más pequeños. cada nodo sólo puede tener 2 ó 3 nodos hijo. los nodos internos se juntan o se parten. Por ejemplo. Los límites superior e inferior en el número de nodos hijo son definidos para cada implementación en particular. pero la mayor sencillez de sus algoritmos tiende a hacerlos más rápidos. Los árboles B tienen ventajas sustanciales sobre otras implementaciones cuando el tiempo de acceso a los nodos excede al tiempo de acceso entre nodos. pero por otro lado pueden desperdiciar memoria. la cantidad de nodos hijo varía dentro de un nodo. Dado que se permite un rango variable de nodos hijo. ÁRBOL-B Ejemplo de árbol B. Los árboles B mantienen los datos ordenados y las inserciones y eliminaciones se realizan en tiempo logarítmico amortizado. Un árbol rojo-negro es más constante en su rendimiento que un árbol AA. Este caso se da usualmente cuando los nodos se encuentran en dispositivos de almacenamiento . los árboles-B no necesitan rebalancearse tan frecuentemente como los árboles binarios de búsqueda autobalanceables. Un árbol-B se mantiene balanceado porque requiere que todos los nodos hoja se encuentren a la misma altura. los árboles-B ó B-árboles son estructuras de datos de árbol que se encuentran comúnmente en las implementaciones de bases de datos y sistemas de archivos. Cuando se inserta o se elimina un dato de la estructura. RENDIMIENTO El rendimiento de un árbol AA es equivalente al de un árbol rojo-negro. DEFINICIÓN La idea tras los árboles-B es que los nodos internos deben tener un número variable de nodos hijo dentro de un rango predefinido. porque los nodos no permanecen totalmente ocupados.

la altura de un árbol-B es: logMn En el peor de los casos. o un tamaño análogo en el dispositivo. rm) tienen que cumplir ciertas condiciones: • El primero tiene valor menor que r1. . DEFINICIÓN BREVE B-árbol es un árbol de búsqueda que puede estar vacío o aquel cuyos nodos pueden tener varios hijos. Los hijos que cuelgan de la raíz (r1. no han explicado el significado de la letra B de su nombre. y además más fáciles de explicar. Por ejemplo. • El último hijo tiene valor mayor que rm. ···. existiendo una relación de orden entre ellos. La raíz tiene al menos 2 hijos si no es un nodo hoja. y todos los valores del subárbol derecho deben ser mayores a a2. Rudolf Bayer y Ed McCreight. etc. debe tener dos valores separadores o elementos a1 y a2. si un nodo interno tiene tres nodos hijo. o a Boeing. la altura del árbol decrece. ESTRUCTURA DE LOS NODOS Cada elemento de un nodo interno actúa como un valor separador. tal como muestra el dibujo. todos los valores del subárbol del centro deben estar entre a1 y a2. ALTURA: EL MEJOR Y EL PEOR CASO En el mejor de los casos. Cada nodo (excepto raíz y hojas) tiene como mínimo M/2 hijos.la altura de un árbol-B es: Donde M es el número máximo de hijos que puede tener un nodo. que lo divide en subárboles. Al maximizar el número de nodos hijo de cada nodo interno. porque sus creadores trabajaban en el Boeing Scientific Research Labs en ese entonces. dado que todos los nodos hoja se mantienen al mismo nivel en el árbol. Un nodo no hoja con k hijos contiene k-1 elementos almacenados.secundario como losdiscos rígidos. las operaciones para balancearlo se reducen. si el tamaño de los nodos se ajustan para caber en un bloque de disco. La B también puede referirse a Bayer. • El segundo tiene valor mayor que r1 y menor que r2. Todos los nodos hoja aparecen al mismo nivel. Un árbol-B de orden M (el máximo número de hijos que puede tener cada nodo) es un árbol que satisface las siguientes propiedades: • • • • • • Cada nodo tiene como máximo M hijos. Usualmente este valor se coloca de forma tal que cada nodo ocupe un bloque de disco. Se cree que la B es debalanceado. Mientras que los árboles B 2-3 pueden ser útiles en la memoria principal. y aumenta la eficiencia. Los creadores del árbol B. el resultado puede ser un árbol B 129-513. Todos los valores del subárbol izquierdo deben ser menores a a1.

un mínimo de L hijos. la raíz sería el único nodo del árbol. pero el costo en la búsqueda. . [editar] class bnodo { public: bnodo (int nClaves). Algunos árboles balanceados guardan valores sólo en los nodos hoja. Un árbol B de altura n+1 puede contener U veces por elementos más que un árbol B de profundidad n. es decir los nodos que no son hoja. y pueden utilizar la misma estructura para todos los nodos. es decir. // Destructor private: int clavesUsadas. Esta relación entre Uy L implica que dos nodos que están a medio llenar pueden juntarse para formar un nodo legal.h> #define TAMANO 1000 struct stclave { int valor. y por lo tanto sus nodos internos y nodos hoja son de diferente tipo. cada nodo interno está por lo menos a medio llenar. Sin embargo. con excepción del nodo raíz. pero no tienen hijos. El número U debe ser 2L o 2L-1. si hubiera menos de L-1 elementos en todo el árbol. Los árboles B guardan valores en cada nodo. El número de elementos se encuentra entre L-1 y U-1. y un nodo lleno puede dividirse en dos nodos legales (si es que hay lugar para subir un elemento al nodo padre). y no tendría hijos. usualmente se representan como un conjunto ordenado de elementos y punteros a los hijos. Para todos los nodos internos exceptuando la raíz.Los nodos internos de un árbol B. // Constructor ~bnodo (). }. el crecimiento del costo es más lento que el del número de elementos. Cada nodo interno contiene un máximo de U hijos y.h> #include <stdlib. Estas propiedades hacen posible que el árbol B se ajuste para preservar sus propiedades ante la inserción y eliminación de elementos. class nodo árbol B en c++ #include <iostream. Por ejemplo. Los nodos hoja tienen la misma restricción sobre el número de elementos. el número de elementos es uno menos que el número de punteros a nodos. como los nodos hoja no tienen hijos. y por tanto carecen de punteros. El nodo raíz tiene límite superior de número de hijos. long registro. inserción y eliminación crece con la altura del árbol. una estructura especial para éstos mejora el funcionamiento. Como todo árbol balanceado. pero no tiene límite inferior.

bnodo *padre. bnodo **puntero. Se empieza en la raíz. escogiendo el sub-nodo de acuerdo a la posición relativa del valor buscado respecto a los valores de cada nodo. }. Típicamente se utiliza la búsqueda binaria para determinar esta posición relativa. y se recorre el árbol hacia abajo.stclave *clave. friend class btree. ALGORITMOS BÚSQUEDA La búsqueda es similar a la de los árboles binarios. PROCEDIMIENTO .

ejemplo2 inserción en árbol B • • Situarse en el nodo raíz. y los valores mayores que el valor medio se colocan en el nuevo nodo derecho. El máximo número de elementos por nodo es U-1.dividiendo todos los nodos que estén llenos encontrados a su paso. Si este número fuera impar. el valor medio actúa como valor separador. Un algoritmo mejorado admite una sola pasada por el árbol desde la raíz. • Volver a paso 2(*). debemos ser capaces de enviar un elemento . entonces hay lugar para uno más. Si el nodo hoja tiene menos elementos que el máximo número de elementos legales. el nodo debe ser dividido en dos nodos.para usar este algoritmo mejorado. Es por esto por lo que la cota inferior del tamaño de los nodos no se aplica a la raíz. • No encontrada: • Si es hoja no existe la clave. • Encontrada fin de procedimiento. y así sucesivamente.Sin embargo. • La clave a buscar k > ki y k < ki+1 hijo iésimo. y cada uno de los nuevos nodos tendrían (U-2)/2 = L-1 elementos. entonces U=2L. (*) Comprobar si contiene la clave a buscar. y por lo tanto serían nodos legales. Si las divisiones de nodos suben hasta la raíz. INSERCIÓN Todas las inserciones se hacen en los nodos hoja. se crea una nueva raíz con un único elemento como valor separador. Así que debe ser posible dividir el número máximo de elementos U-1 en dos nodos legales. • Los valores menores que el valor medio se colocan en el nuevo nodo izquierdo.hasta el nodo donde la inserción tenga lugar. Inserte el nuevo elemento en el nodo. respetando el orden de los elementos. • • • Realizando una búsqueda en el árbol. lo que puede provocar que el padre sea dividido en dos. La división se realiza de la siguiente manera: • Se escoge el valor medio entre los elementos del nodo y el nuevo elemento. • El valor separador se debe colocar en el nodo padre. La mitad de este número es L-1. así que habría 2L-2 elementos en el nodo. De otra forma. Si U-1 fuera par. • En otro caso el nodo actual es el hijo que corresponde: • La clave a buscar k < k1: hijo izquierdo. se halla el nodo hoja en el cual debería ubicarse el nuevo elemento. U=2L-1. que es el número mínimo de elementos permitidos por nodo. y dos hijos.Esto evita la necesidad de volver a cargar en memoria los nodos padres.que pueden ser caros si los nodos se encuentran en una memoria secundaria.

reestructurar el árbol para que cuando se encuentre el elemento a ser borrado. • • localizar y eliminar el elemento. Segundo. o hacer una única pasada de arriba a abajo por el árbol. y luego corregir.lo que explica por qué algunos libros de texto imponen este requisito en la definición de árboles-B Eliminación La eliminación de un elemento es directa si no se requiere corrección para garantizar sus propiedades. ELIMINACIÓN EN UN NODO HOJA • • Busque el valor a eliminar. Hay dos estrategias populares para eliminar un nodo de un árbol B. Si el valor se encuentra en un nodo hoja. el elemento puede ser un separador de un nodo interno. pero cada vez que se visita un nodo.Esto requiere que U=2L en lugar deU=L-1. puede suceder que al borrar el elemento. se elimina directamente la clave. el número de elementos del nodo quede debajo de la cota mínima. pueda eliminarse sin necesidad de continuar reestructurando Se pueden dar dos problemas al eliminar elementos: primero. por lo que se requerirán cambios adicionales en el árbol. Estos problemas se tratan a continuación en orden.al nodo padre y dividir el resto U-2 elementos en 2 nodos legales. Eliminar clave 20 de un nodo interno ELIMINACIÓN EN UN NODO INTERNO .sin añadir un nuevo elemento. posiblemente dejándolo con muy pocos elementos.

2. En el segundo caso. Los subárboles son trasplantados por completo. y cuando ese elemento es eliminado. uno de los dos nodos hijos tienen un número de elementos mayor que el mínimo. REBALANCEO DESPUÉS DE LA ELIMINACIÓN Si al eliminar un elemento de un nodo hoja el nodo se ha quedado con menos elementos que el mínimo permitido. Esto también cambia los separadores del nodo padre. L-1. Si los dos nodos hermanos inmediatos tienen el mínimo número de elementos. tanto el hijo izquierdo como el derecho tienen el número mínimo de elementos. el menor elemento del subárbol derecho es el menor elemento que es mayor que el separador.Cada elemento de un nodo interno actúa como valor separador para dos subárboles. quizá incluso hasta a la raíz. 4. examine el nodo hermano inmediato de la izquierda. Si el nodo hermano inmediato de la derecha del nodo deficiente tiene más del mínimo número de elementos. y no se alteran si se mueven a un otro nodo padre. Si el nodo hermano inmediato de la derecha del nodo deficiente tiene el mínimo número de elementos. elimínelo del nodo hoja en que se encuentra. A menos que se sepa que este árbol B en particular no tiene datos duplicados. escoja un nuevo separador (puede ser el mayor elemento del subárbol izquierdo o el menor elemento del subárbol derecho). y la redistribución se debe aplicar iterativamente hacia arriba del árbol. que es un número que no excede U-1 y por lo tanto es un nodo legal. y cualquiera de los dos puede ser el nuevo separador. 6. De la misma forma. La estrategia consiste en hallar un hermano para el nodo deficiente que tenga más del mínimo número de elementos y redistribuir los elementos entre los hermanos para que todos tengan más del mínimo. Si el valor se encuentra en un nodo interno. Elimine el separador del padre. 1. En el primero. pueden suceder dos casos. 3. Redistribuya los subárboles de los dos nodos . Redistribuya los elementos restantes en los nodos hijo derecho e izquierdo. colocando el separador del padre entre los elementos de los dos nodos hermanos fundidos. En algunos casos el cambio lleva la deficiencia al nodo padre. se debe tratar este caso de manera equivalente. cree un nuevo nodo con todos los elementos del nodo deficiente. escoja el valor medio entre el separador y ambos hermanos como nuevo separador y colóquelo en el padre. Note que el mayor elemento del árbol izquierdo es el mayor elemento que es menor que el separador. y reemplace el elemento a eliminar por el nuevo separador. 5. Entonces se debe hallar un nuevo separador para estos dos subárboles. Ambos elementos se encuentran en nodos hoja. algunos elementos se deben redistribuir. Pueden entonces fundirse en un único nodo con 2L-2 elementos. Como se ha eliminado un elemento de un nodo hoja. también se debe eliminar el elemento en cuestión (recursivamente) del nuevo nodillo. todos los elementos de uno de sus hermanos. Dado que la cota mínima en el número de elementos no se aplica a la raíz. y esto puede hacerse mientras los elementos se redistribuyen. y reemplace los dos hijos que separaba por el nuevo nodo fundido. el problema desaparece cuando llega a ésta. .

7. el modo más eficiente para construir el árbol-B inicial no sería insertar todos los elementos en el conjunto inicial sucesivamente. y después construir los nodos internos a partir de este conjunto. cada nodo excepto el último contendrá un valor más. En el ejemplo. tenemos que construir inicialmente 5 nodos hoja conteniendo 5 valores cada uno (excepto el último que contiene 4): 1 2 3 5 6 7 8 1 0 11 1 1 1 1 2 3 4 5 16 1 1 1 2 7 8 9 0 21 2 2 2 2 3 4 Construiremos el siguiente nivel hacia arriba desde las hojas tomando el último elemento de cada hoja excepto el último. Representa una colección de datos ordenados de manera que se permite una inserción y borrado . Luego el siguiente nivel de nodos internos nos quedaría de la siguiente manera: 5 1 1 0 5 20 1 2 3 6 7 8 11 1 1 1 2 3 4 16 1 1 1 7 8 9 21 2 2 2 2 3 4 Este proceso se continuará hasta que alcancemos un nivel con un solo nodo y no esta sobrecargado. Si esa acción deja al número de elementos del padre por debajo del mínimo. CONSTRUCCIÓN INICIAL En aplicaciones. a menos que sea la raíz. todas las hojas excepto la última tienen un elemento más. el cual será utilizado para construir los nodos internos. un árbol-B es un tipo de estructura de datos de árboles. En este caso. De nuevo. repita estos pasos en el nuevo nodo deficiente. Inicialmente. es supuesto que los nodos internos contienen como mucho 2 valores (por lo que pueden tener 3 hijos). es frecuentemente útil construir un árbol-B para representar un gran número de datos existentes y después actualizarlo de forma creciente usando operaciones Standard de los árboles-B. Por ejemplo. En nuestro ejemplo solo nos quedaría el nivel de la raíz: 15 5 1 0 20 1 2 3 6 7 8 11 1 1 1 2 3 4 16 1 1 1 7 8 9 21 2 2 2 2 3 4 En informática. ya que no tiene cota mínima en el número de elementos. si no construir el conjunto inicial de nodos hoja directamente desde la entrada. si los nodos hoja tienen un tamaño máximo de 4 y el conjunto inicial es de enteros desde el 1 al 24.

donde cada nodo de información del árbol tiene un máximo de g hijos. es un árbol m-caminos si y solo si: multirrama son estructuras de datos de . Los nodos hoja se encuentran unidos entre sí como una lista enlazada para permitir búsqueda secuencial. McCreight: Organization and Maintenance of Large Ordered Indexes. DEFINICIÓN Un árbol multicamino posee un grado g mayor a dos. El número de claves que pueden ser indexadas usando un árbol-B+ está en función del orden del árbol y su altura. El mínimo número de claves por registro es la mitad del máximo número de claves. cada nodo (exceptuando la raíz) debe tener entre n/2 y n claves. Un árbol-B+ es una variación de un árbol-B. Por ejemplo. multinivel. Los nodos internos sólo contienen claves y punteros. Para un árbol-B+ de orden n. El número máximo de claves en un registro es llamado el orden del árbol-B+. más bajo nivel. con una altura h: Número máximo de claves es: nh Número mínimo de claves es: 2(n / 2)h − 1 El árbol-B+ fue descrito por primera vez en el documento "Rudolf Bayer. dinámico.eficientes de elementos. Sea un árbol de m-caminos A. Todas las hojas se encuentran en el mismo. toda la información se guarda en las hojas. en contraste respecto un árbol-B. Acta Informática 1: 173-189 (1972)". Es un índice. si el orden de un árbol-B+ es n. con un límite máximo y mínimo en el número de claves por nodo. En un árbol-B+. Edward M. ÁRBOL MULTICAMINO Los árboles multicamino o árboles tipo árbol usadas en computación.

• VENTAJAS E INCONVENIENTES La principal ventaja de este tipo de árboles consiste en que existen más nodos en un mismo nivel que en los árboles binarios con lo que se consigue que. organizados en archivos. pudiendo ser: 1 <= i <= nClaves • Clavei < Clavei+1 • Cada valor de clave en el subárbol Enlacei es menor que el valor de Clavei+1 • Los subárboles Enlacei. son los enlaces a los subárboles de A. los accesos a los nodos sean más rápidos..A está vacío Cada nodo de A muestra la siguiente • estructura: [nClaves.Enlace0. si el árbol es de búsqueda.Clave1. • Existen muchas aplicaciones en las que el volumen de la información es tal. . pudiendo ser: 0 <= nClaves <= g-1 Enlacei. Cuando esto ocurre lo más frecuente es transformar el árbol multicamino en su binario de búsqueda equivalente.ClavenClaves.. son también árboles m-caminos.. pudiendo ocurrir que en ocasiones la mayoría de los nodos no tengan descendientes o al menos no todos los que podrían tener desaprovechándose por tanto gran cantidad de memoria. Esta organización de archivos debe ser suficientemente adecuada como para recuperar los datos del mismo en forma eficiente. pudiendo ser: 0 <= i <= nClaves Clavei.EnlacenClaves] nClaves es el número de valores de clave de un nodo. en dispositivos de almacenaminento secundario. son los valores de clave. que los datos no caben en la memoria principal y es necesario almacenarlos. donde 0 <= i <= nClaves.. El inconveniente más importante que tienen es la mayor ocupación de memoria.

. En estos casos se puede usar terminología de relaciones familiares para descubrir las relaciones entre los nodos de un árbol. los nodos de un árbol y la diferencia entre nodos sucesores y nodos terminales. como se muestran en el contenido del trabajo. entre las cosas que podemos mencionar se encuentra la raíz. Es bueno hacer énfasis en esto ya que se puede saber mucho sobre lo que tiene que ver con los árboles. y que un árbol puede ser implementado fácilmente en una computadora.CONCLUSIÓN De este trabajo se podría decir que un árbol binario se define como un conjunto finito de elementos llamados nodos.

E-GRAFIA http://www.php?id=17 http://es.net/articles.org/wiki/%C3%81rbol_binario .monografias.com/trabajos36/arboles/arboles2.shtml#binarios http://www.algoritmia.wikipedia.

Sign up to vote on this title
UsefulNot useful