Árbol Binario

July 2, 2018 | Author: Richar Fernandez Vilchez | Category: Computer Programming, Areas Of Computer Science, Mathematics, Science, It/Computer Sciences
Share Embed Donate


Short Description

Download Árbol Binario...

Description

1.

Árboles

1.1. 1. 1. Defi Defini nici ción ón de árbo árboll Un árbol es una estructura de datos, que puede definirse de forma recursiva como: - Una estruc estructura tura vacía vacía o - Un elemen elemento to o clave clave de infor informa mació ción n (nodo) (nodo) más un número número finito finito de estructuras tipo árbol, disjuntos, llamados subárboles. Si dicho número de estructuras es inferior o igual a 2, se tiene un árbol binario. Es, por tanto, una estructura no secuencial.

Pero para este presente trabajo se ampliará el tema de Arboles Binarios.

2. Árbol Binario Binario 2.1. 2. 1. Defi Defini nici ción ón de árbo árboll Se define un árbol binario como un conjunto finito de elementos (nodos) que bien está vacío o está formado por una raíz con dos árboles binarios disjuntos, es decir, dos descendientes directos llamados subárbol izquierdo y subárbol derecho. Los Los árbo árbole less bina binario rioss (tam (tambi bién én llam llamad ados os de grad grado o 2) tien tienen en una una espe especi cial al importancia. Las aplicaciones de los arboles binarios son muy variadas ya que se les puede utilizar para representar una estructura en la cual es posible tomar decisiones con dos opciones en distintos puntos. Árbol Binario

Estructuras tipo Árbol

Estructuras que no son Arboles

2.2. Términos en árboles binarios. • •











Si el nodo raíz tiene 0 relaciones se llama hoja. Si el nodo raíz tiene 1 relación a la izquierda, el segundo elemento de la relación es el subárbol izquierdo. Si el nodo raíz tiene 1 relación a la derecha, el segundo elemento de la relación es el subárbol derecho. Si A es la raíz de un árbol y B es la raíz de su subárbol izquierdo (o derecho), se dice que A es el padre de B y se dice que B es el hijo izquierdo (o derecho)de A. El nodo a es antecesor del nodo b (y recíprocamente el nodo b es descendiente del nodo a), si a es el padre de b o el padre de algún ancestro de b. Un nodo b es un descendiente izquierdo del nodo a, si b es el hijo izquierdo de a o un descendiente del hijo izquierdo de a. Un descendiente derecho se define de la misma forma. Dos nodos son hermanos si son hijos izquierdo y derecho del mismo padre.

Otros términos relacionados con árboles, tienen que ver con su funcionamiento y topología: •





Si cada nodo que NO es una hoja tiene un subárbol izquierdo y un subárbol derecho, entonces se trata de un árbol binario completo. El nivel de un nodo es el número de aristas que se deben recorrer para llegar desde ese nodo al nodo raíz. De manera que el nivel del nodo raíz es 0, y el nivel de cualquier otro nodo es el nivel del padre más uno. La profundidad de un nodo es el máximo nivel de cualquier hoja en el árbol.

2.3. Clasificación de Arboles Binarios Existen cuatro tipos de árbol binario:

• • • •

Árbol Binario Distinto. Árbol Binario Similares. Árbol Binario Equivalentes. Árbol Binario Completos.

A continuación se hará una breve descripción de los diferentes tipos de árbol binario así como un ejemplo de cada uno de ellos. Árbol Binario Distinto Se dice que dos árboles binarios son distintos cuando sus estructuras son diferentes. •







Árbol Binario Similar Dos árboles binarios son similares cuando sus estructuras son idénticas, pero la información que contienen sus nodos es diferente. Árbol Binario Equivalente Son aquellos arboles que son similares y que además los nodos contienen la misma información. Árbol Binario Completo Son aquellos arboles en los que todos sus nodos excepto los del último nivel, tiene dos hijos; el subárbol izquierdo y el subárbol derecho.

2.4. Recorrido de un Árbol binario Recorrer un árbol consiste en acceder una sola vez a todos sus nodos. Esta operación es básica en el tratamiento de árboles y nos permite, por ejemplo, imprimir toda la información almacenada en el árbol, o bien eliminar toda esta información o, si tenemos un árbol con tipo base numérica, sumar todos los valores... En el caso de los árboles binarios, el recorrido de sus distintos nodos se debe realizar en tres pasos: o o o

acceder a la información de un nodo dado, acceder a la información del subárbol izquierdo de dicho nodo, acceder a la información del subárbol derecho de dicho nodo.

Imponiendo la restricción de que el subárbol izquierdo se recorre siempre antes que el derecho, esta forma de proceder da lugar a tres tipos de recorrido, que se diferencian por el orden en el que se realizan estos tres pasos. Así distinguimos: •

Preorden: primero se accede a la información del nodo, después al subárbol izquierdo y después al derecho.

Ejemplo:



void preOrden(ArbolBinario raíz   ) { if(raiz) { visitar(raiz–>dato); preOrden(raiz–>izq); preOrden(raiz–>der); { { El recorrido en PreOrden del árbol es el siguiente:

Inorden: primero se accede a la información del subárbol izquierdo, después se accede a la información del nodo y, por último, se accede a la información del subárbol derecho.

void enOrden(ArbolBinario raíz) { if(raiz) { enOrden(raiz–>izq); visitar(raiz–>dato); enOrden(raiz–>der); } } Ejemplo: El recorrido en EnOrden del árbol es el siguiente:



Postorden: primero se accede a la información del subárbol izquierdo, después a la del subárbol derecho y, por último, se accede a la información del nodo. void PostOrden(ArbolBinario raí  z) { if(raiz) { PostOrden(raíz–>izq); PostOrden(raíz–>der); visitar(raiz–>dato); }

Ejemplo:

El recorrido en PostOrden del árbol es el siguiente:

Si el nodo del que hablamos es la raíz del árbol, estaremos recorriendo todos sus nodos. Debemos darnos cuenta de que esta definición del recorrido es claramente recursiva, ya que el recorrido de un árbol se basa en el recorrido de sus subárboles izquierdo y derecho usando el mismo método. Aunque podríamos plantear una implementación iterativa de los algoritmos de recorrido, el uso de la recursión simplifica enormemente esta operación.

2.5. Operaciones -

Borrar: Elimina del árbol a un nodo dado Búsqueda: Buscar un elemento en un Árbol de Búsqueda Insertar: inserta un nodo dentro de un árbol Construir: crea un árbol con un elemento raíz y dos ramas. Copiar: crear una copia del árbol CrearArbol: Inicia un árbol vacío Elementos: determina el número de elementos del árbol EsVacio: comprueba si el árbol tiene nodos Igualar: determinar si dos árboles son idénticos Pertenece: Determina si un elemento pertenece a un árbol. Recorrer: el árbol de acuerdo algunos de los criterios Profundidad: determina la profundidad de un árbol dado .…

2.6. Árboles binarios de búsqueda

Un árbol binario de búsqueda es una estructura de datos de tipo árbol binario en el que para todos sus nodos, el hijo izquierdo, si existe, contiene un valor menor que el nodo padre y el hijo derecho, si existe, contiene un valor mayor que el del nodo padre.

2.6.1. Búsqueda en Árbol de Búsqueda

Nodo *buscar(Nodo *raiz, TipoElemento buscado) { if(!raiz) return 0; /*Árbol vacío*/ else if (buscado==raiz–>dato) return raiz; else if (buscadodato) return buscar(raiz–>izq, buscado); else return buscar(raiz–>der, buscado); } 2.6.2.

Insertar en Árboles de Búsqueda La operación de inserción de un nuevo nodo en un árbol binario de búsqueda consta de tres fases básicas: 1. Creación del nuevo nodo 2. Búsqueda de su posición correspondiente en el árbol. Se trata de encontrar la posición que le corresponde para que el árbol resultante siga siendo de búsqueda. 3. Inserción en la posición encontrada. Se modifican de modo adecuado los enlaces de la estructura.

La creación de un nuevo nodo supone simplemente reservar espacio para el registro asociado y rellenar sus tres campos. Dado que no nos hemos impuesto la restricción de que el árbol resultante sea equilibrado, consideraremos que la posición adecuada para insertar el nuevo nodo es la hoja en la cual se mantiene el orden del árbol. Insertar el nodo en una hoja supone una operación mucho menos complicada que tener que insertarlo como un nodo interior y modificar la posición de uno o varios subárboles completos. La inserción del nuevo nodo como una hoja supone simplemente modificar uno de los enlaces del nodo que será su padre. Veamos con un ejemplo la evolución de un árbol conforme vamos insertando nodos siguiendo el criterio anterior respecto a la posición adecuada.

Lenguaje C++

void insertar (Nodo** raiz, TipoElemento dato) { if (!(*raiz)) *raiz = crearNodo(dato); else if (dato < (*raiz) -> dato) insertar (&((*raiz) - > izdo), dato); else insertar (&((*raiz) - > dcho), dato); }

2.6.3. Eliminar de un Árbol Binario de Búsqueda La eliminación de un nodo de un árbol binario de búsqueda es más complicada que la inserción, puesto que puede suponer la recolocación de varios de sus nodos. En líneas generales un posible esquema para abordar esta operación es el siguiente: 1. Buscar el nodo que se desea borrar manteniendo un puntero a su padre. 2. Si se encuentra el nodo hay que contemplar tres casos posibles: a. Si el nodo a borrar no tiene hijos, simplemente se libera el espacio que ocupa b. Si el nodo a borrar tiene un solo hijo, se añade como hijo de su padre, sustituyendo la posición ocupada por el nodo borrado. c. Si el nodo a borrar tiene los dos hijos se siguen los siguientes pasos: i. Se busca el máximo de la rama izquierda o el mínimo de la rama derecha. ii. Se sustituye el nodo a borrar por el nodo encontrado.

Veamos gráficamente varios ejemplos de eliminación de un nodo:

Lenguaje C++ void eliminar (Nodo** r,  TipoElemento dato) { if (!(*r)) puts("Nodo no encontrado"); else if (dato < (*r) -> dato) eliminar(&(*r) -> izdo, dato); else if (dato > (*r) -> dato) eliminar(&(*r) -> dcho,dato); /* Nodo encontrado */ else /* puntero al nodo { Nodo* q; a suprimir */

q = (*r); /* r es el ptr del nodo

Padre */

if (q -> izdo == NULL) (*r) = q- > dcho; else if (q -> dcho == NULL)

(*r) = q -> izdo; /* tiene rama izquierda y else

derecha */

}

reemplazar(&q); free(q); }

void reemplazar(Nodo** act) { Nodo* a, *p; p = *act; a = (*act) -> izdo; /* menores a IZQ*/

while (a -> dcho) { p = a; /* buscamos el Mayor a

DER*/

a = a -> dcho; }

else p -> dcho = a -> izdo; (*act) = a; }

/* Cambio de Campo Datos */

(*act) -> dato = a -> dato;

/* Al Abuelo p, se hace cargo de nieto IZQ */

if (p == (*act)) p -> izdo = a -> izdo;

/* Ojo: No puede tener nada a Derecha, pues abríamos bajado en el while.*/

Bibliografía • • • •

• •

http://html.rincondelvago.com/arboles-binarios_1.html http://es.wikipedia.org/wiki/%C3%81rbol_binario http://www.oocities.org/grupo22uagrm/ARBOLES.PDF http://es.wikibooks.org/wiki/Estructuras_de_datos_din%C3%A1micas/ %C3%81rboles http://www.algoritmia.net/articles.php?id=17 http://www.ucema.edu.ar/~rst/Algoritmos_y_Estructura_de_Datos/Teoria/5 ._Arboles_binarios.pdf 

Anexos Terminología

La terminología que por lo regular se utiliza para el manejo de arboles es la siguiente: •







• •

• •



Hijo: X es hijo de Y, sí y solo sí el nodo X es apuntado por Y. También se dice que X es descendiente directo de Y. Padre: X es padre de Y sí y solo sí el nodo X apunta a Y. También se dice que X es antecesor de Y. Hermano: Dos nodos serán hermanos si son descendientes directos de un mismo nodo. Hoja: Se le llama hoja o terminal a aquellos nodos que no tienen ramificaciones (hijos). Nodo anterior: Es un nodo que no es raíz ni terminal. Grado: Es el número de descendientes directos de un determinado nodo. Grado de un árbol: Es el máximo grado de todos los nodos del árbol. Nivel: Es el número de arcos que deben ser recorridos para llegar a un determinado nodo. Por definición la raíz tiene nivel 1. Altura: Es el máximo número de niveles de todos los nodos del árbol.

• •

Peso: Es el número de nodos del árbol sin contar la raíz. Longitud de camino: Es el número de arcos que deben ser recorridos para llegar desde la raíz al nodo X. Por definición la raíz tiene longitud de camino 1, y sus descendientes directos longitud de camino 2 y así  sucesivamente.

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF