P. 1
ARBOLES

ARBOLES

|Views: 250|Likes:
Publicado porJonathan Diaz

More info:

Published by: Jonathan Diaz on Oct 27, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOC, PDF, TXT or read online from Scribd
See more
See less

04/20/2015

pdf

text

original

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.

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

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

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

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

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

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

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

Ese elemento se busca en el array inorden. Queda esto: . Antes de explicarlo se recomienda al lector que lo intente hacer por su cuenta. Asimismo los elementos entre der y la raíz forman el subárbol derecho. ¿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.} Por último. Sin embargo no se ha estudiado ningún método para crearlos. Los elementos en el array inorden entre izq y la raíz forman el subárbol izquierdo. Por tanto se tiene este árbol: A continuación comienza un proceso recursivo. cuyo tamaño está limitado por los índices izq y der. almacenados en sendos arrays. La siguiente posición en el recorrido en preorden es la raíz de este subárbol. 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. Se procede a crear el subárbol izquierdo. considérese la sustitución de la cola por una pila en el recorrido en amplitud. 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. es sencillo cuando uno es capaz de construir el árbol viendo sus recorridos pero sin haber visto el árbol terminado.

Á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. puesto que b no tiene subárbol izquierdo: Después seguirá construyéndose el subárbol derecho a partir de la raíz a. disjuntos. tal y como indican los índices izq y der. que no tiene ningún descendiente. • • • Un ejemplo de árbol binario de búsqueda: .El subárbol b tiene un subárbol derecho. Todas las claves del subárbol derecho al nodo son mayores que la clave del nodo. Se ha obtenido el subárbol izquierdo completo de la raíz a. Ambos subárboles son árboles binarios 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). 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.

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. Si se codifica el árbol en Pascal no se puede establecer una relación de orden para las claves. De todas formas es poco probable que se de un caso de este tipo en la práctica. 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 ejemplo. Además. Ahora bien. suponer que se tiene un árbol vacío.entonces el número de comparaciones necesarias para localizar una clave es aproximadamente de logN en el peor caso.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. pero más eficiente que el de borrado en un array ordenado. Ejemplo: 1. hasta encontrar su ubicación. reduciendo drásticamente su eficacia para localizar un elemento.4.3.6. son más rápidos para insertar y borrar elementos. Se crea un árbol cuya raíz tiene la clave 1. 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. Se inserta la clave 2 en el subárbol derecho de 1. Suponer que se van a ir introduciendo las claves de forma ascendente. Si el árbol está perfectamente equilibrado -esto es. 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.5. En el ejemplo de la figura 5 las claves son números enteros. suponer que el tipo de datos de la clave es un puntero (da igual a lo que apunte). Continuando las inserciones se ve que el árbol degenera en una lista secuencial. Por tanto. para todos los nodos. que admite claves de tipo entero. Dada la raíz 4. las claves del subárbol izquierdo son menores que 4. donde se emplearía búsqueda dicotómica para localizar un elemento. Esto se cumple también para todos los subárboles. el algoritmo de inserción en un árbol binario de búsqueda tiene la ventaja -sobre los arrays ordenados. A continuación se inserta la clave 3 en el subárbol derecho de 2. insertar la clave 7 en el árbol de la figura 5 requiere avanzar por el árbol hasta llegar a la clave 8. Si las claves a introducir llegan de forma más o menos aleatoria entonces la implementación de . e introducir la nueva clave en el subárbol izquierdo a 8. puesto que Pascal no admite determinar si un puntero es mayor o menor que otro. El algoritmo de borrado en árboles es algo más complejo.2. y las claves del subárbol derecho son mayores que 4. Por ejemplo. 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.

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

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

tan pequeños como sea posible en todo momento. elem). tarbol *aux. automáticamente. void borrar(tarbol **a. if (*a == NULL) /* no existe la clave */ return. elem). if ((*a)->izq == NULL) *a = (*a)->der. else if ((*a)->clave > elem) borrar(&(*a)->izq. &aux). en momentos clave. else if ((*a)->der == NULL) *a = (*a)->izq. else if ((*a)->clave == elem) { aux = *a. 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) . 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. else sustituir(&(*a)->izq. /* se sustituye por la mayor de las menores */ } } free(aux). Mantener baja la altura se consigue habitualmente realizando transformaciones en el árbol. y los árboles binarios de búsqueda ordinarios pueden tomar alturas muy grandes en situaciones normales. if ((*a)->clave < elem) borrar(&(*a)->der. tarbol **aux). ÁRBOL BINARIO DE BÚSQUEDA AUTO-BALANCEABLE En ciencias de la computación. Esto es importante. o el número de niveles de nodos bajo la raíz. un árbol binario de búsqueda autobalanceable o equilibrado es un árbol binario de búsqueda que intenta mantener su altura. int elem) { void sustituir(tarbol **a. como cuando las claves son insertadas en orden. ya que muchas operaciones en un árbol de búsqueda binaria tardan un tiempo proporcional a la altura del árbol.

para ahorrar memoria. 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. En los árboles rojo-negro las hojas no son relevantes y no contienen datos. 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). o bien no contándolos nunca (el resultado es equivalente). Además de los requisitos impuestos a los árboles binarios de búsqueda convencionales.Para algunas implementaciones estos tiempos son el peor caso. todas las referencias de los nodos internos a las hojas van a parar al nodo centinela. 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). un único nodo (nodo-centinela) hace de nodo hoja para todas las ramas. 5. También es llamada "Propiedad del camino". Todas las hojas son negras (las hojas son los hijos nulos). mientras que para otras están amortizados. se deben satisfacer los siguientes para tener un árbol rojo-negro válido: 1. y por tanto el camino no puede tener dos rojos seguidos. es posible moverse ordenadamente a través de los elementos de forma eficiente si hay forma de localizar el padre de cualquier nodo. se le denomina "Altura negra del árbol". En los árboles rojo-negro. . Cada camino simple desde un nodo a una hoja descendiente contiene el mismo número de nodos negros. A la hora de implementarlo en un lenguaje de programación. Todo nodo es o bien rojo o bien negro. La raíz es negra. ya sea contando siempre los nodos negros nulos. 4. 3. y al número de nodos negros de cada camino. 2. Así. que es constante para todos los caminos. como en todos los árboles binarios de búsqueda. Los hijos de todo nodo rojo son negros (también llamada "Propiedad del rojo").

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

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

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

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. Take the middle node. function insert is input: X. output: A balanced version T including X.return Nil else if level(T) == level(right(right(T))) then We have two horizontal right links. 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. the root of the tree to insert it into. and T. and return it. Después. elevate it. se realiza una torsión. es fácil comprobar la validez del árbol y realizar las rotaciones que se precisen. the value to be inserted. a medida que se desenrolla la pila de llamadas. se realiza una división. return node(X. Nil. Si aparece un enlace horizontal izquierdo. Lo que hace necesario continuar comprobando la validez del árbol a medida que las modificaciones suben desde las hojas. if nil(T) then Create a new leaf node with X. Observe que el código de muestra realiza un incremento de nivel(T). Do the normal binary tree insertion procedure. posiblemente incrementando el nivel del nuevo nodo raíz del subárbol correspondiente. Nil) else if X < value(T) then . y si aparecen dos enlaces horizontales derechos. 1.

todo el nivel debe ser torsionado y dividido. left(T)) else if X > value(T) then right(T) := insert(X. o a los que les faltan hijos. 2. right(T)) end if Note that the case of X == value(T) is unspecified. Tras un borrado. Después. Dividir el nivel. aunque implementaciones reales pueden optar por un enfoque más optimizado. Dada la propiedad de los árboles AA de que todos los nodos de un nivel superior a uno tienen dos hijos. an insert will have no effect. As given. Para recuperar un predecesor simplemente se debe seguir un enlace izquierdo y después todos los enlaces derechos restantes. si es necesario. or not a rotation will occur or not are inside of the procedures. Torsionar el nivel. 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. Perform skew and then split. dependiendo del que esté en el árbol o de los deseos del implementador. 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. The implementor may desire different behavior. Decrementar el nivel. el nodo sucesor o predecesor tendrá nivel 1. 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. Sin embargo.left(T) := insert(X. De forma similar. 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. debemos torsionar y dividir todo el nivel en lugar de un solo nodo lo que complica nuestro código. haciendo que su eliminado sea trivial. La que describió Andersson en su publicación original es la más simple. function delete is . 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. y se describirá aquí. as given above. Para re-equilibrar un árbol existen diferentes aproximaciones.

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

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

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

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

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

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

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

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

En el ejemplo. si los nodos hoja tienen un tamaño máximo de 4 y el conjunto inicial es de enteros desde el 1 al 24. Por ejemplo.7. un árbol-B es un tipo de estructura de datos de árboles. Representa una colección de datos ordenados de manera que se permite una inserción y borrado . En este caso. a menos que sea la raíz. si no construir el conjunto inicial de nodos hoja directamente desde la entrada. 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. CONSTRUCCIÓN INICIAL En aplicaciones. De nuevo. Si esa acción deja al número de elementos del padre por debajo del mínimo. Inicialmente. ya que no tiene cota mínima en el número de elementos. 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. el cual será utilizado para construir los nodos internos. cada nodo excepto el último contendrá un valor más. 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. todas las hojas excepto la última tienen un elemento más. 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. y después construir los nodos internos a partir de este conjunto. el modo más eficiente para construir el árbol-B inicial no sería insertar todos los elementos en el conjunto inicial sucesivamente. repita estos pasos en el nuevo nodo deficiente.

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

El inconveniente más importante que tienen es la mayor ocupación de memoria.A está vacío Cada nodo de A muestra la siguiente • estructura: [nClaves.. que los datos no caben en la memoria principal y es necesario almacenarlos.. los accesos a los nodos sean más rápidos.Enlace0. pudiendo ser: 0 <= i <= nClaves Clavei.EnlacenClaves] nClaves es el número de valores de clave de un nodo. .. 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 también árboles m-caminos. • 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. pudiendo ser: 0 <= nClaves <= g-1 Enlacei.. donde 0 <= i <= nClaves. son los enlaces a los subárboles de A. en dispositivos de almacenaminento secundario. • Existen muchas aplicaciones en las que el volumen de la información es tal. organizados en archivos. Cuando esto ocurre lo más frecuente es transformar el árbol multicamino en su binario de búsqueda equivalente. son los valores de clave.ClavenClaves. si el árbol es de búsqueda. Esta organización de archivos debe ser suficientemente adecuada como para recuperar los datos del mismo en forma eficiente.Clave1. 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.

los nodos de un árbol y la diferencia entre nodos sucesores y nodos terminales.CONCLUSIÓN De este trabajo se podría decir que un árbol binario se define como un conjunto finito de elementos llamados nodos. En estos casos se puede usar terminología de relaciones familiares para descubrir las relaciones entre los nodos de un árbol. y que un árbol puede ser implementado fácilmente en una computadora. . 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.

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

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->