Está en la página 1de 55

Estructura de Archivos

Árboles Binarios
Árboles Binarios

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.
Árboles Binarios
Árboles Binarios

 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.
Árboles Binarios
Árboles Binarios

No más de 2 subárboles por nodo Estructuras de control de información

t i c as
Recursivos c terís Puede contener de 1 a 2n
ra
Ca

Cada nodo puede tener cada nodos puede ser la raíz de un


0,1 ó 2 hijos subárbol
Árboles Binarios
Equilibrio

 La distancia de un nodo al nodo 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 sólo pueden ser
accedidos siguiendo sólo dos ramas del árbol.
Equilibrio

 La característica anterior nos conduce a una


característica 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
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.
Equilibrio

B= hD –hI
 Un árbol está perfectamente equilibrado si su
equilibrio o balance es cero, y sus subárboles
son también perfectamente equilibrados. 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.
Árboles Binarios Completos

 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
nodos a nivel n es un árbol lleno. Un árbol 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.
Árboles Binarios Completos
Especificación del Árbol
Binario

r ir
r ea l stru a cío íz
C bo on v a
Ar C Es R

Inicia el Crea un Comprueba Devuelve


árbol árbol con un si el árbol el nodo
como elemento no tiene raíz
vacío raíz y dos nodos
ramas,
izquierda y
derecha que
son, a su
vez, árboles
Especificación del Árbol
Binario

e
r do c ho
rr ar ne
c
uie e re Bo Pe
rt e
Izq D

Obtiene Obtiene la Elimina del Determina


la rama rama árbol el nodo si un
subárbol subárbol con un elemento se
izquierdo Derecho de elemento encuentra
de un un árbol determinado en el árbol
árbol dado
dado
Estructura de un Árbol Binario

 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 respectivamente, Un valor NULL indica
un árbol o un subárbol vacío.
Estructura de un Árbol Binario

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 < puntero a Nodo >
Datos < Tipodato >
subarbolDerecho < puntero a Nodo >
Fin nodo
Estructura de un Árbol Binario

Representación enlazada de dos árboles


binarios
Estructura de un Árbol Binario

Árbol binario y su estructura en nodos


Representación de un Nodo

 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
tipoElemento.

www.themegallery.com
Creación de un Árbol Binario

 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
raíz. Las ramas izquierda y Derecha son a su vez
árboles binarios que tienen su 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 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.
Ejemplo

ArbolBinario crearNodo (TipoElemento x)


{
ArbolBinario a;
a= (ArbolBinario) malloc(sizeof(Nodo));
a -> dato = x;
a -> decho = a ->izdo = NULL;
return a;
}
Creación de un Árbol Binario

 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.
Ejemplo:

Void nuevoArbol (ArbolBinario* raíz, ArbolBinario


ramaIzqda, TipoElemento x,
ArbolBinario ramaDrcha)
{
*raíz = CrearNodo(x);
(*raíz) -> izdo = ramaIzqda;
(raíz) -> dcho = ramaDrcha;
}
Creación de un Árbol Binario

Árbol binario de cadena de caracteres.


Operaciones en Árboles
Binarios
 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 en Árboles
Binarios
Operaciones
Determinar su altura Todas las operaciones se
pueden realizar recorriendo el
Determinar su número de elementos
árbol de un modo sistemático.
Hacer copia El recorrido de un árbol es la
operación de visita al árbol, o
Visualizar el árbol en pantalla lo que es lo mismo, la visita a
Determinar si dos árboles son idénticos cada nodo del árbol una vez y
sólo una, La visita de un árbol
Borrar (Eliminar árbol) es necesaria en muchas
Si es de expresión, evaluarlo ocasiones, por ejemplo, si se
desea imprimir la información
contenida en cada nodo.
Árbol Binario de Búsqueda.

 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 binaria similar al empleado en arrays.
 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.

Árbol Binario de búsqueda para nodos con el campo de datos de tipo int.
Creación de un Árbol 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 ser mayores que los datos.
Inicialmente el árbol está vacío y se desea
insertar el 8. La única elección es almacenar el
8 en la raíz.
Creación de un Árbol de Búsqueda.

 A continuación viene el 3, ya que el 3 es menor


que el 8, el 3 debe ir en el subárbol izquierdo.

3
Creación de un Árbol de Búsqueda.

 A continuación se ha de insertar 1 que se menor


que 8 y que 3, por consiguiente irá a la
izquierda y debajo de 3:

1
Creación de un Árbol de Búsqueda.
 Cada nuevo elemento se inserta como una hoja
del árbol. Los restantes elementos 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.
Nodo de un Árbol Binario de Búsqueda.

 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
nodo contiene información relativa a una persona. Cada
nodo almacena un nombre de un alumno (dato de tipo
cadena) y el número de matrícula en su universidad
(Dato entero).
Creación de un nodo.

 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;
}
Recorrido de un Árbol.

 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.
Recorrido de un Árbol.

 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 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 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).
Recorrido de un Árbol.

 Según 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)
Recorridos de árboles binarios.
Recorrido Preorden.

 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
3.- Recorrer el sub{árbol derecho (D) en preorden.
Recorrido 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.
Recorrido Preorden de un árbol binario.
Recorrido Preorden de un árbol binario.
 En la función preorden( ) se implementa el algoritmo de
recorrido en C, la condición que indica que 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);
}
}
Recorrido en Orden.

 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.
 
Recorrido enorden de un árbol binario.
Ejemplo:

 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); /*recorre subárbol izquierdo*/
Visitar(razi ->dato); /*procesa raíz*/
Enorden (raíz ->dcho); /*recorre subárbol derecho*/
}
}
 
Recorrido Postorden.

 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).
Recorrido Postorden.
Recorrido Postorden.
 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);
}
}
Arboles binarios paginados

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 disco,
en vez de extraer unos cuantos bytes, se le una página
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 dirección, se carga la
pagina, y en caso de que se requiera otra y está en la
misma página su extracción es muy rápida, de esta
manera se ahorra un desplazamiento en el disco.
Calculo de la eficiencia de un árbol binario paginado

 Árbol binario
Log2(N+1)
 Árbol binario paginado
Logk+1(N+1)

Donde; N= Numero de nodos


k= Numero de nodos por pagina
Ejemplos

Log2 (134 217 727+1) = 27


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

Log2 (63+1) =7
Log7+1(63+1) =3
Arboles B*

 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.
 Ejemplo; Considérese un sistema en el que se 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 de tal manera que queden lo mas
completo que se 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.
Propiedades de un árbol B*

1. Cada pagina tiene un máximo de m descendientes.


2. Cada pagina excepto la raíz y las hojas tienen al
menos (2m-1)/3 descendientes
3. La raíz tiene al menos dos descendientes (a menos
que sea hoja)
4. Todas las hojas tienen el mismo nivel
5. Una pagina que sea hoja con k descendientes
contiene k-1 llaves
6. Una pagina hoja contiene por lo menos (2m-1)/3
llaves y no mas de m-1  
Ejemplo de redistribución de un árbol B*

Árbol original
M

A C D F H K
P R S T V X

División de dos a tres;


Después de F R

Insertar la llave B

A B C D S T V X

H K M P

También podría gustarte