Arboles Binarios

July 17, 2022 | Author: Anonymous | Category: N/A
Share Embed Donate


Short Description

Download Arboles Binarios...

Description

 

Estructura de Archivos

 



Un árbol binario es un árbol en el que ningún nodo puede tener más de dos subárboles. En un árbol binario, cada nodo puede tener cero, uno o dos hijos (subárboles). 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 raíz de su propio subárbol y tiene hijos, que son raíces de árboles llamados subárboles derecho e izquierdo del nodo, respectivamente. Un árbol binario se divide en tres subconjuntos: {R} Nodo raíz {I1,I2,…,In} Subárbol izquierdo de R {D1,D2,…,Dn} Subárbol derecho de R.

 

No más de 2 subárboles por nodo

Recursivos

Cada nodo puede tener 0,1 ó 2 hijos

Estructuras de control de información

Puede contener de 1 a 2n

cada nodos puede ser la raíz de un subárbol

 



La distancia de un nodo al nodo raíz raíz determina la eficiencia con la que puede ser localizado. Por ejemplo, dado cualquier nodo de un árbol, a sus hijos se puede acceder siguiendo sólo un camino de bifurcación o de ramas, el que conduce al nodo deseado. De modo similar, los nodos a nivel 2 un árbol serárbol. accedidos siguiendo sólosólo dos pueden ramas del

 



La característica anterior nos conduce a una característica muy importante de un árbol binario, su balance equilibrio. Para determinar si árbol estáElequilibrado, se calcula deun equilibrio. factor de equilibrio desu unfactor árbol árbol binario es la diferencia en altura entre los subárboles derecho e izquierdo. Si la altura del subárbol izquierdo es h, y la altura del subárbol derecho es hD, entonces el factor de equilibrio del árbol B se determina por la siguiente fórmula.

 

B= hD –hI  

Un árbol está perfectamente equilibrado si su equilibrio o balance es cero,equilibrados. y sus subárboles subárbole s son también perfectamente Dado que esta definición ocurre raramente se aplica una definición alternativa. Un árbol binario está equilibrado si la altura de sus subárboles difiere en no más de uno (su factor de equilibrio es -1, 01, +1) y sus subárboles son también 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 más a la izquierda del árbol.   Un árbol binario completo que contiene 2n   n es un árbol lleno. Un árbol nodos a nivel lleno es un árbol binario que tiene el máximo número de entradas para su altura. Esto sucede cuando el último nivel está lleno.

 

Inicia el árbol como vacío 

Crea un árbol con un elemento raíz y dos ramas, izquierda y derecha que son, a su vez, árboles 

Comprueba si el árbol no tiene nodos 

Devuelve el nodo raíz 

 

Obtiene la rama

Obtiene la rama

Elimina del árbol el nodo

Determina si un

subárbol izquierdo de un árbol dado 

subárbolde Derecho un árbol dado 

con un elemento determinado 

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 subárbol izquierdo y otro al subárbol derecho, que se conocen como puntero izquierdo y puntero derecho Un valor indica unrespectivamente, árbol o un subárbol vacío.NULL  

 

Representación gráfica 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 Subarbolzquierdo Datos subarbolDerecho subarbolDerec ho Fin nodo 

< puntero a Nodo >  < Tipodato >  < puntero a Nodo > 

 

Representación 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 izquierdo derecho. El tipotipo de dado de dato, los elemento se ygeneraliza como Elemento.

www.themegallery.com  



A partir del nodo raíz de un árbol se puede acceder a los demás nodos del árbol, por ello el puntero que permite acceder al árbol es el que referencia a laárboles raíz. Las ramasque izquierda son a su vez binarios tienen ysuDerecha raíz, y así recursivamente hasta llegar a las hojas del árbol. La formación del árbol para por la creación de cada uno denodo correspondiente los  padre. nodosPara y elcrear enlace un nodo con de el 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(Nod malloc(sizeof(Nodo)); o));  a -> dato = x;  a -> decho = a ->izdo = NULL;  return a;   } 

 



La función nuevoArbol( ) crea un árbol cuya raíz 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* raíz, ArbolBinario ramaIzqda, TipoElemento x,   ArbolBinario ramaDrcha) ramaDrcha)  {   *raíz = CrearNodo(x);  (*raíz) -> izdo = ramaIzqda;  (raíz) -> dcho = ramaDrcha;   } 

 

 Árbol binario de cadena de caracteres. caracteres.

 



Una vez que se tiene creado un árbol binario, se pueden realizar diversas operaciones sobre él. El hacer uso de una operación u otra dependerá de la aplicación que se le quiera dar al árbol. Algunas de las operaciones típicas que se realizan en árboles binarios son:

 

Operaciones Determinar su altura Determinar su número de elementos Hacer copia Visualizar el árbol en pantalla Determinar si dos árboles son idénticos Borrar (Eliminar árbol) Si es de expresión, evaluarlo

Todas las operaciones se pueden realizar recorriendo el árbol de un modo sistemático. El recorrido de un árbol es la operación de visita al árbol, o lo que es lo mismo, la visita a cada nodo del árbol una vez y sólo una, La visita de un árbol es necesaria en muchas ocasiones, por ejemplo, si se desea imprimir la información contenida en cada nodo.

 





Estos árboles se denominan árboles binarios de búsqueda, debido a que se pueden buscar en ellos un término utilizando un algoritmo de búsqueda arrays. binaria similar al empleado en

Un árbol binario de búsqueda es aquel que dado un nodo, todos los datos del subárbol izquierdo son menores que los datos de ese nodo, mientras que todos los datos del subárbol derecho son mayores que sus propios datos.

 

Árbol Binario de Búsqueda.

 



Supongamos que se desean almacenar los números 8, 3, 1, 20, 10, 5, 4 en un árbol binario de búsqueda. 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 mayores queylos Inicialmente el ser árbol está vacío se datos. desea insertar el 8. La única elección es almacenar el 8 en la raíz.

 

 

8



A continuación viene ya que elizquierdo. 3 es menor que el 8, el 3 debe ir enelel3,subárbol 8

3

 



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

3

1

 



Cada nuevo inserta como inserta una hoja del árbol. Loselemento restantesseelementos se pueden situar fácilmente: 8

20

3 5

10

1 4

Una propiedad de los árboles binarios de búsqueda es que no son únicos para los mismos datos.

 





Un nodo de un árbol binario de búsqueda no difiere en nada de los nodos de un árbol binario, tiene un campo de datos y dos punteros a los subárboles izquierdo y derecho respectivamente.   Un árbol de búsqueda se puede utilizar cuando se necesita que la información se encuentre rápidamente. Un ejemplo de árbol binario de búsqueda es el que cada a una persona. Cadanodo nodocontiene almacenainformación un nombre relativa de un alumno (dato de tipo cadena) y el número de matrícula en su universidad (Dato entero).

 

La función tiene como entrada un dato entero, que representa un número de matrícula 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 sólo 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 raíz a través de un hijo, al descendiente más 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 raíz a todos sus hijos, a continuación a los hijos de sus hijos y así sucesivamente todosen loselnodos han sido procesados. En hasta otras que palabras, recorrido en anchura, cada nivel se procesa totalmente antes de que comience el siguiente nivel.



La designación tradicional de los recorridos utiliza un nombre para el nodo raíz (N), para el subárbol izquierdo (I) y para el subárbol derecho (D).

 



  Según sea la estrategia a seguir, los recorridos enorden se conoceny como  (inorder), preorden  (peorder) 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 raíz va antes que los subárboles: 1.- Visitar el nodo raíz (N) 2.- Recorrer el subárbol izquierdo (I) en preorden 

D

3.- Recorrer el sub{árbol derecho ( ) en preorden.

 



Dadas las características recursivas de los árboles, el algoritmo de recorrido tiene naturaleza recursiva. Primero se procesa la raíz, a continuación el subárbol izquierdo y después el subárbol derecho. Para procesar el subárbol izquierdo, se hace una llamada recursiva al procedimiento Preorden y luego se hace lo mismo con el subárbol derecho.

 



En recorrido de la funciónen preorden( C, la condición ) se implementa que indicaelque algoritmo continúe el recorrido es: raíz ¡= NULL, o simplemente, raíz. Void preorden (ArbolBinario raiz)  {   If(raiz)  {   Visitar(raíz ->-> dato);     Preorden(raíz izdo); Preorden(raíz -> dcho);   }   } 

 



El recorrido enorden (inorder) procesa primero el suárbol izquierdo, después el raíz y a continuación el subárbol derecho. El significado de in- es que la raíz se

procesa entre los subárboles. Si el árbol no está vacío, el método implica los siguientes pasos: 1.- Recorrer el subárbol izquierdo (I) en inorden. 2.- Visitar el nodo raíz (N) 3.- Recorrer el subárbol derecho (D) en inorden.

 



La siguiente función visita y escribe el contenido de los nodos de un árbol binario de acuerdo al recorrido EnOrden. La función tiene como parámetro un puntero al nodo raíz del árbol.

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

/*recorre subárbol izquierdo*/   /*procesa raíz*/   /*recorre subárbol derecho*/  

 



El recorrido postorden (IDN) procesa el nodo raíz (post) después de que los subárboles izquierdo y derecho se han procesado. Se comienza situándose en la hoja más a la izquierda y se procesa. A continuación se procesa su subárbol derecho. Por último se procesa el nodo raíz. Las etapas del algoritmo, si el árbol no está vacío son: 1.- Recorrer el subárbol izquierdo (I) en postorden. 2.- Recorrer el subárbol derecho (D) en postorden. 3.- Visitar el nodo raíz (N).

 



La función postorden ( ) implementa en C el algoritmo correspondiente.

Void postorden (ArbolBinario raiz)  {  

If(raiz)  {   Postorden (raíz ->izdo);  Postorden(raíz -> dcho);  Visitar (raíz -> dato); 

 }   } 

 



Estos parten de la premisa de desplazamiento lento y transferencia rápida, en el disco, lo cual lleva a la paginación. La manera en la que se utiliza la paginación es que una vez que se a posicionado en una parte del página disco, en vez dedeextraer unossecuantos bytes, se le una competa, este modo 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 dirección, se carga la pagina, y ensucaso de que se requiera otra y está en la misma página extracción es muy rápida, 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 redistribución durante la inserción para incluir nuevas reglas para la división. Considérese un sistema en el que se Ejemplo; pospone la división, mediante la redistribución. Esto quiere decir que se insertan los elementos y después se agrupan para dejar la mayor parte de nodos redistribuidos tal manera que queden lo mas completo que se de pueda. El aspecto mas importante de esta división 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 máximo de m descendientes. descendientes. Cada pagina excepto la raíz y las hojas tienen al menos descendientes La raíz (2m-1)/3 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

A

C

D

F

H

K

División de dos a tres; Después de

P

F

R

S

T

V

X

S

T

R

Insertar la llave B

A

B

C

D

H

K

M

P

V

X

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF