Вы находитесь на странице: 1из 54

Estructura de Archivos

Un rbol binario es un rbol en el que ningn nodo puede tener ms de dos subrboles. En un rbol binario, cada nodo puede tener cero, uno o dos hijos (subrboles). Se conoce el nodo de la izquierda como hijo izquierdo y el nodo de la derecha como hijo derecho.

Un rbol binario es una estructura recursiva. Cada nos es la raz de su propio subrbol y tiene hijos, que son races de rboles llamados subrboles derecho e izquierdo del nodo, respectivamente. Un rbol binario se divide en tres subconjuntos: {R} Nodo raz {I1,I2,,In} Subrbol izquierdo de R {D1,D2,,Dn} Subrbol derecho de R.

No ms de 2 subrboles por nodo

Estructuras de control de informacin

Recursivos

Puede contener de 1 a 2n

Cada nodo puede tener 0,1 2 hijos

cada nodos puede ser la raz de un subrbol

La distancia de un nodo al nodo raz determina la eficiencia con la que puede ser localizado. Por ejemplo, dado cualquier nodo de un rbol, a sus hijos se puede acceder siguiendo slo un camino de bifurcacin o de ramas, el que conduce al nodo deseado. De modo similar, los nodos a nivel 2 un rbol slo pueden ser accedidos siguiendo slo dos ramas del rbol.

La caracterstica anterior nos conduce a una caracterstica muy importante de un rbol binario, su balance equilibrio. Para determinar si un rbol est equilibrado, se calcula su factor de equilibrio. El factor de equilibrio de un rbol binario es la diferencia en altura entre los subrboles derecho e izquierdo. Si la altura del subrbol izquierdo es h, y la altura del subrbol derecho es hD, entonces el factor de equilibrio del rbol B se determina por la siguiente frmula.

B= hD hI Un rbol est perfectamente equilibrado si su equilibrio o balance es cero, y sus subrboles son tambin perfectamente equilibrados. Dado que esta definicin ocurre raramente se aplica una definicin alternativa. Un rbol binario est equilibrado si la altura de sus subrboles difiere en no ms de uno (su factor de equilibrio es -1, 01, +1) y sus subrboles son tambin equilibrados.

Un rbol binario completo de profundidad n es un rbol en el que para cada nivel, del 0 al nivel n-1 tiene un conjunto lleno de nodos y todos los nodos hoja a nivel n ocupan las posiciones ms a la izquierda del rbol. Un rbol binario completo que contiene 2n nodos a nivel n es un rbol lleno. Un rbol lleno es un rbol binario que tiene el mximo nmero de entradas para su altura. Esto sucede cuando el ltimo nivel est lleno.

Inicia el rbol como vaco

Crea un rbol con un elemento raz y dos ramas, izquierda y derecha que son, a su vez, rboles

Comprueba si el rbol no tiene nodos

Devuelve el nodo raz

Obtiene la rama subrbol izquierdo de un rbol dado

Obtiene la rama subrbol Derecho de un rbol dado

Elimina del rbol el nodo con un elemento determinado

Determina si un elemento se encuentra en el rbol

La estructura de un rbol binario se construye con nodos. Cada nodo debe contener el campo dato (datos a almacenar) y dos campos de tipo puntero, uno al subrbol izquierdo y otro al subrbol derecho, que se conocen como puntero izquierdo y puntero derecho respectivamente, Un valor NULL indica un rbol o un subrbol vaco.

Representacin grfica de los campos de un nodo.

El tipo de datos correspondiente a la estructura de un nodo de un rbol binario es el siguiente: Nodo Subarbolzquierdo Datos subarbolDerecho Fin nodo < puntero a Nodo > < Tipodato > < puntero a Nodo >

Representacin enlazada de dos rboles binarios

rbol binario y su estructura en nodos

El nodo se representa mediante una estructura (struct) para as agrupar a todos los campos de que consta. Se supone que el nodo tiene los campos dato, izquierdo y derecho. El tipo de dado de los elemento se generaliza como tipo Elemento.

www.themegallery.com

A partir del nodo raz de un rbol se puede acceder a los dems nodos del rbol, por ello el puntero que permite acceder al rbol es el que referencia a la raz. Las ramas izquierda y Derecha son a su vez rboles binarios que tienen su raz, y as recursivamente hasta llegar a las hojas del rbol. La formacin del rbol para por la creacin de cada uno de los nodos y el enlace con el correspondiente nodo padre. Para crear un nodo de un rbol binario, se reserva memoria para el nodo, se asigna el dato al campo correspondiente y se inicializa los punteros izdo, dcho a NULL.

ArbolBinario crearNodo (TipoElemento x) { ArbolBinario a; a= (ArbolBinario) malloc(sizeof(Nodo)); a -> dato = x; a -> decho = a ->izdo = NULL; return a; }

La funcin nuevoArbol( ) crea un rbol cuya raz es un nodo con el campo dato el que se pasa como tercer argumento, la rama izquierda y derecha del rbol se pasan como segundo y cuarto argumentos.

Void nuevoArbol (ArbolBinario* raz, ArbolBinario ramaIzqda, TipoElemento x, ArbolBinario ramaDrcha) { *raz = CrearNodo(x); (*raz) -> izdo = ramaIzqda; (raz) -> dcho = ramaDrcha; }

rbol binario de cadena de caracteres.

Una vez que se tiene creado un rbol binario, se pueden realizar diversas operaciones sobre l. El hacer uso de una operacin u otra depender de la aplicacin que se le quiera dar al rbol. Algunas de las operaciones tpicas que se realizan en rboles binarios son:

Operaciones
Determinar su altura Determinar su nmero de elementos Hacer copia Visualizar el rbol en pantalla Determinar si dos rboles son idnticos Borrar (Eliminar rbol)

Si es de expresin, evaluarlo

Todas las operaciones se pueden realizar recorriendo el rbol de un modo sistemtico. El recorrido de un rbol es la operacin de visita al rbol, o lo que es lo mismo, la visita a cada nodo del rbol una vez y slo una, La visita de un rbol es necesaria en muchas ocasiones, por ejemplo, si se desea imprimir la informacin contenida en cada nodo.

Estos rboles se denominan rboles binarios de bsqueda, debido a que se pueden buscar en ellos un trmino utilizando un algoritmo de bsqueda binaria similar al empleado en arrays. Un rbol binario de bsqueda es aquel que dado un nodo, todos los datos del subrbol izquierdo son menores que los datos de ese nodo, mientras que todos los datos del subrbol derecho son mayores que sus propios datos.

rbol Binario de Bsqueda.

Supongamos que se desean almacenar los nmeros 8, 3, 1, 20, 10, 5, 4 en un rbol binario de bsqueda. Siguiendo la regla, dado un nodo en el rbol todos los datos a su izquierda deben ser menores que todos los datos del nodo actual, mientras que todos los datos a la derecha deben ser mayores que los datos. Inicialmente el rbol est vaco y se desea insertar el 8. La nica eleccin es almacenar el 8 en la raz.

A continuacin viene el 3, ya que el 3 es menor que el 8, el 3 debe ir en el subrbol izquierdo.


8

A continuacin se ha de insertar 1 que se menor que 8 y que 3, por consiguiente ir a la izquierda y debajo de 3:
8

Cada nuevo elemento se inserta como una hoja del rbol. Los restantes elementos se pueden situar fcilmente:
8

3 5 1 4

20

10

Una propiedad de los rboles binarios de bsqueda es que no son nicos para los mismos datos.

Un nodo de un rbol binario de bsqueda no difiere en nada de los nodos de un rbol binario, tiene un campo de datos y dos punteros a los subrboles izquierdo y derecho respectivamente. Un rbol de bsqueda se puede utilizar cuando se necesita que la informacin se encuentre rpidamente. Un ejemplo de rbol binario de bsqueda es el que cada nodo contiene informacin relativa a una persona. Cada nodo almacena un nombre de un alumno (dato de tipo cadena) y el nmero de matrcula en su universidad (Dato entero).

La funcin tiene como entrada un dato entero, que representa un nmero de matrcula y el nombre. Devuelve un puntero al nodo creado. Nodo* crearNodo(int id, const char* n) { Nodo* t; t= (Nodo*) malloc(sizeof(Nodo)); t-> nummat =id; strcpy(t -> nombre, n); t -> izdo = t > dcho = NULL; return t; }

Un recorrido de un rbol binario requiere que cada nodo del rbol sea procesado (visitado) una vez y slo una en una secuencia predeterminada. Existen dos enfoques generales para la secuencia de recorrido, profundidad y anchura. El recorrido en profundidad, el proceso exige un camino desde la raz a travs de un hijo, al descendiente ms lejano del primer hijo antes de proseguir a un segundo hijo. En otras palabras, en el recorrido en profundidad, todos los descendientes de un hijo se procesan antes del siguiente hijo.

En el recorrido en anchura, el proceso se realiza horizontalmente desde la raz a todos sus hijos, a continuacin a los hijos de sus hijos y as sucesivamente hasta que todos los nodos han sido procesados. En otras palabras, en el recorrido en anchura, cada nivel se procesa totalmente antes de que comience el siguiente nivel. La designacin tradicional de los recorridos utiliza un nombre para el nodo raz (N), para el subrbol izquierdo (I) y para el subrbol derecho (D).

Segn sea la estrategia a seguir, los recorridos se conocen como enorden (inorder), preorden (peorder) y postorden(postorder): Preorden (nodo-izquierdo-derecho)(NID) Enorden (izquierdo-nodo-derecho)(IND) Postorden (izquierdo-derecho-nodo)(IDN)

El recorrido preorden(NID) conlleva los siguientes pasos, en los que el nodo raz va antes que los subrboles: 1.- Visitar el nodo raz (N) 2.- Recorrer el subrbol izquierdo (I) en preorden 3.- Recorrer el sub{rbol derecho (D) en preorden.

Dadas las caractersticas recursivas de los rboles, el algoritmo de recorrido tiene naturaleza recursiva. Primero se procesa la raz, a continuacin el subrbol izquierdo y despus el subrbol derecho. Para procesar el subrbol izquierdo, se hace una llamada recursiva al procedimiento Preorden y luego se hace lo mismo con el subrbol derecho.

En la funcin preorden( ) se implementa el algoritmo de recorrido en C, la condicin que indica que contine el recorrido es: raz = NULL, o simplemente, raz.

Void preorden (ArbolBinario raiz) { If(raiz) { Visitar(raz -> dato); Preorden(raz -> izdo); Preorden(raz -> dcho); } }

El recorrido enorden (inorder) procesa primero el surbol izquierdo, despus el raz y a continuacin el subrbol derecho. El significado de in- es que la raz se procesa entre los subrboles. Si el rbol no est vaco, el mtodo implica los siguientes pasos: 1.- Recorrer el subrbol izquierdo (I) en inorden. 2.- Visitar el nodo raz (N) 3.- Recorrer el subrbol derecho (D) en inorden.

La siguiente funcin visita y escribe el contenido de los nodos de un rbol binario de acuerdo al recorrido EnOrden. La funcin tiene como parmetro un puntero al nodo raz del rbol.

Void enorden (ArbolBinario raiz) { If(raiz) { Enroden (raz -> izdo); Visitar(razi ->dato); Enorden (raz ->dcho); } }

/*recorre subrbol izquierdo*/ /*procesa raz*/ /*recorre subrbol derecho*/

El recorrido postorden (IDN) procesa el nodo raz (post) despus de que los subrboles izquierdo y derecho se han procesado. Se comienza situndose en la hoja ms a la izquierda y se procesa. A continuacin se procesa su subrbol derecho. Por ltimo se procesa el nodo raz. Las etapas del algoritmo, si el rbol no est vaco son: 1.- Recorrer el subrbol izquierdo (I) en postorden. 2.- Recorrer el subrbol derecho (D) en postorden. 3.- Visitar el nodo raz (N).

La funcin postorden ( ) implementa en C el algoritmo correspondiente.

Void postorden (ArbolBinario raiz) { If(raiz) { Postorden (raz ->izdo); Postorden(raz -> dcho); Visitar (raz -> dato); } }

Estos parten de la premisa de desplazamiento lento y transferencia rpida, en el disco, lo cual lleva a la paginacin. La manera en la que se utiliza la paginacin es que una vez que se a posicionado en una parte del disco, en vez de extraer unos cuantos bytes, se le una pgina competa, de este modo se aprovecha el desplazamiento que se hace en el disco, lo cual nos ayuda a resolver la relativa lentitud que existe en estos desplazamientos. Por ejemplo, si se quiere extraer cierta direccin, se carga la pagina, y en caso de que se requiera otra y est en la misma pgina su extraccin es muy rpida, de esta manera se ahorra un desplazamiento en el disco.

rbol binario Log2(N+1) rbol binario paginado Logk+1(N+1) Donde; N= Numero de nodos k= Numero de nodos por pagina

Log2 (134 217 727+1) = 27 Log511+1 (134 217 727+1) = 3

Log2 (63+1) =7 Log7+1(63+1) = 3

En el estudio y las aplicaciones de los arboles B, Knuth extiende la idea de la redistribucin durante la insercin para incluir nuevas reglas para la divisin. Ejemplo; Considrese un sistema en el que se pospone la divisin, mediante la redistribucin. Esto quiere decir que se insertan los elementos y despus se agrupan para dejar la mayor parte de nodos redistribuidos de tal manera que queden lo mas completo que se pueda. El aspecto mas importante de esta divisin de dos a tres que produce paginas que se llenan hasta las dos terceras partes, en vez de solo la mitad.

1.

2.

3.

4. 5.

6.

Cada pagina tiene un mximo de m descendientes. Cada pagina excepto la raz y las hojas tienen al menos (2m-1)/3 descendientes La raz tiene al menos dos descendientes (a menos que sea hoja) Todas las hojas tienen el mismo nivel Una pagina que sea hoja con k descendientes contiene k-1 llaves Una pagina hoja contiene por lo menos (2m-1)/3 llaves y no mas de m-1

rbol original
M

Divisin de dos a tres; Despus de Insertar la llave B

Вам также может понравиться