Árboles
DESCRIPTION
Estructuras de datos no linealesTRANSCRIPT
Estructura no lineal en la que lo datos seorganizan de modo que los elementos deinformación están organizados entre sí a travésde ramas.
Un árbol es una estructura jerárquica cadaelemento tiene un único predecesor y puedetener varios sucesores.
Existe un único camino entre el primer nodo dela estructura y cualquier otro nodo.
Un árbol consta de un conjuntofinito de elementos, denominadosnodos, y un conjunto finito delíneas dirigidas, denominadasramas, que conectan los nodos.
El camino es el enlace entre nodos. No existe uncamino entre todos los nodos.
El número de ramas asociado con un nodo es el gradodel nodo. Es el número máximo de hijos que tienen losnodos del árbol.
El nivel de un nodo o longitud del camino es sudistancia o número de enlaces que hay desde el nodohasta la raíz.
La altura o profundidad de un árbol es el nivel de lahoja del camino más largo desde la raíz más uno.
El peso de un árbol es el número de nodosterminales.
Bosque: colección de árboles
Orden: es el número potencial de hijos quepuede tener cada elemento de árbol.
Si el árbol no esta vacío, entonces el primer nodo se llama raíz.
A
FEB
C D G H I
raízNivel 0
Nivel 1
Nivel 2Altura: 3
Peso del árbol: 6
Nodo Padre de un nodo N es aquel que apunta almismo. En un árbol cada nodo sólo puede tenerun padre.
Nodo Hijo de otro nodo A es cualquier nodoapuntado por el nodo A. Un nodo puede tenervarios hijos.
Nodo Raíz es el único del árbol que no tienepadre.
Nodo hermano: son nodos del mismo padre.
A es el padre de B y C, y a su vez, B es el padre de D.
B y C son los nodos hijos de A y todos los nodos tienen uno o dos hijos.
El nodo raíz es el que se encuentra en la parte superior del árbol: A
B y C son nodos hermanos
Hojas son todos los nodos que no tienen hijos.
Nodos Interiores son los nodos que no son ni elnodo raíz, ni nodos hoja.
Camino es una secuencia de nodos, en el que dosnodos consecutivos cualesquiera son padre ehijo.
Rama es un camino desde el nodo raíz a unahoja.
Son hojas los nodos situadosen la parte inferior: D, G, H yF.
Son nodos interiores B, C y E.
A-B-D es un camino, al igualque E-G y C-E-H.
A-C-E-G y AC-F son ramas.
El árbol es de grado dos.
Un árbol general sería un árbol en el que cadanodo puede tener un número ilimitado desubárboles.
Un árbol binario sería un conjunto de 0 o másnodos en el cual existe un nodo raíz y cadauno de los nodos, incluido el raíz podrántener 0, 1 o 2 subárboles:
◦ Subárbol izquierdo y subárbol derecho.◦ Cada nodo es como máximo de grado 2.
El árbol del ejemplo anterior es un árbolbinario, ya que cada nodo tiene comomáximo dos hijos.
Se debe notar que en cualquier árbol, no sóloen los binarios, si se elimina el nodo raíz, seobtienen dos árboles.
Aquel que colgaba del enlace izquierdo delnodo raíz se denomina subárbol izquierdo yaquel que colgaba del enlace derecho sedenomina subárbol derecho.
Árboles similares: árboles con la mismaestructura.
Árboles equivalentes: árboles con la mismaestructura y contienen la misma información.
Árboles completos o árboles perfectos: todos losnodos tienen dos hijos y todas las hojas están en elmismo nivel. Se denomina completo porque cadanodo, excepto las hojas, tiene el máximo de hijos quepuede tener.
◦ Un árbol binario de nivel n tiene 2n-1 nodos.
Árbol equilibrado: un árbol en el que las alturasde los dos subárboles de cada uno de los nodostiene como máximo una diferencia de unaunidad.
Árbol degenerado: todos sus nodos sólo tienen un subárbol.
Existen algunos tipos especiales de árboles binarios en función de ciertas propiedades.
◦ Árbol binario equilibrado es aquel en el que en todos sus nodos se cumple la siguiente propiedad:
| altura(subárbol_izquierdo) -
altura(subárbol_derecho) | ≤ a 1
En árboles binarios completos se cumple que en el nivelk hay 2k nodos y que, en total, si la altura es h, entonceshay 2h - 1 nodos.
En el nivel 0 tenemos 20 = 1 nodos, en el nivel 1 tenemos 21 = 2nodos y en el nivel 2 tenemos 22=4 nodos.
En total el árbol es de altura 3 y por tanto contiene 23-1 = 7nodos.
Al igual que ocurre en el caso de las listas, sepuede implementar un árbol binario medianteestructuras estáticas o mediante estructurasdinámicas. En ambos casos, cada nodo del árbolcontendrá tres valores:
◦ La información de un tipo base dado contenida en elnodo.
◦ Un enlace al hijo derecho (raíz del subárbol derecho)◦ Un enlace al hijo izquierdo (raíz del subárbol
izquierdo)
Cada nodo debería tener un número indeterminadode enlaces que apunten a cada uno de sus hijos.
Problema ¿cuántos enlaces reservamos?
Se pueden implementar como un array conindicaciones al padre de cada nodo.
Implementación mediante una lista de hijos
◦ En un índice aparecen todos los nodos
◦ Por cada nodo existe una lista de hijos
Implementación mediante una lista de listas
◦ Cada nodo apunta a una lista enlazada
◦ En esa lista, cada nodo apunta a un nodo hijo.
Los árboles generales son más difíciles de implementarque los árboles binarios.
Un árbol general se puede convertir a binario:
a) La raíz del árbol binario será la raíz del árbol general.b) Se enlaza el hijo situado más a la izquierda del nodo
raíz del árbol general como hijo izquierdo del nodoraíz en el árbol binario.
c) Se enlazan todos los hermanos como hijos derechosen el árbol binario.
d) El proceso se repite con cada nodo.
Se pueden implementar como un array deelementos del tipo base del árbol.
◦ El primer elemento corresponde al nivel 0 del árbol.◦ Los dos siguientes elemento corresponden al nivel 1 del
árbol.◦ Los cuatro siguientes elementos corresponden al nivel 2
del árbol.◦ Los ocho siguientes elementos corresponden al nivel 3
del árbol.◦ Los dieciséis siguientes elementos corresponden al nivel
4 del árbol.◦ …
Se puede implementar como un array de nodos
Mediante estructuras dinámicas.
◦ El árbol estaría compuesto por una serie de nodos.
◦ Cada nodo contendría:
El campo raíz con la información del tipo base del árbol.
Los punteros hizq e hder que serían punteros a nodo, es decir, serían también árboles.
Si alguno se esos hijos es un árbol vacío contendrían un valor nulo.
◦ El tipo de dato árbol sería un puntero a nodo.
◦ Un puntero a nodo indicaría el nodo de inicio de la estructura, es decir, la raíz del árbol.
En una estructura de datos lineal sólo es posibleun tipo de recorrido en dos sentidos distintos:
◦ Del primero al último o del último al primero.
Una estructura de datos no lineal se puederecorrer de distintas maneras:
◦ ¿Se realiza un recorrido por niveles, accediendo a losnodos hermanos de cada nivel?
◦ Una vez situados en un nodo, ¿a qué hijo se accedeprimero?
◦ En que momento se accede a la información del nodo,¿antes o después de los hijos?
Recorrer un árbol consiste en acceder una sola vez a todos sus nodos.
En general existen dos grandes grupos derecorridos:
◦ Recorridos en profundidad.
Se recorren las ramas de un nodo dado.
◦ Recorridos en anchura.
Se accede a los nodos hermanos en cada uno de losniveles del árbol.
Tres tipos de recorridos dependiendo del orden enque se acceda al subárbol izquierdo, al subárbolderecho o al nodo raíz.
En los tres recorridos se accede antes al hijoizquierdo que al hijo derecho.
La variación reside en el momento en que se recorrerála información del nodo.
◦ Recorrido preorden u orden previo (RID, raíz-hijoizquierdo-hijo derecho).
◦ Recorrido inorden u orden simétrico (IRD, hijo izquierdo-raíz-hijo derecho).
◦ Recorrido postorden u orden posterior (IDR, hijo izquierdo-hijo derecho-raíz).
Recorrido preorden.
Por cada elemento no vacío:◦ Se accede primero al nodo raíz.
◦ Se accede al hijo izquierdo en preorden.
◦ Se accede al hijo derecho en preorden.
M,F,C,A,E,H,P,R,Q,Z
Recorrido inorden.
Por cada elemento no vacío:
◦ Se accede al hijo izquierdo en inorden.
◦ Se accede al nodo raíz.
◦ Se accede al hijo derecho en inorden.
A,C,E,F,H,M,P,Q,R,Z
Recorrido postorden.
Por cada elemento no vacío:
◦ Se accede al hijo izquierdo en postorden.
◦ Se accede al hijo derecho en postorden.
◦ Se accede al nodo raíz.
A,E,C,H,F,Q,Z,R,P,M
El recorrido se hace por niveles a partir delnivel 0.
◦ Por cada nivel se recorren los nodos hermanos deizquierda a derecha.
M F P C H R A E Q Z
Para su implementación hay que procesar el nodo raíz yrecordar las direcciones de sus hijos izquierdo y derechopara acceder a ellos en el mismo orden en que seencuentran.
Hay que repetir el proceso por cada nodo, recordando lasdirecciones de sus hijos izquierdo y derecho yrecuperarlas en el mismo orden en que han entrado.
Existe una estructura de datos que extrae los elementosen el mismo orden en que entran: la cola.
◦ Se utiliza una cola que almacene árboles (punteros a nodos).◦ Se introduce la dirección del nodo raíz en la cola.◦ Se extraen elementos de la cola y por cada elemento que se
extrae que no sea un árbol vacío (un puntero nulo), se introducenlas direcciones de sus hijos izquierdo y derecho.
◦ El proceso termina cuando la cola esté vacía.
Un árbol binario de búsqueda es una estructurade datos de tipo árbol binario en el que paratodos sus nodos, el hijo izquierdo, si existe,contiene un valor menor que el nodo padre y elhijo derecho, si existe, contiene un valor mayorque el del nodo padre.
Los nodos están ordenados de maneraconveniente para la búsqueda.
Dada la siguiente lista: M D P V C A F R Y N S, el árbol de búsqueda resultante sería:
Obsérvese que:
El recorrido inorden del árbol devolvería los elementos en orden ascendente.
Para buscar un elemento hay que compararlo con el que ocupa la raíz del árbol:
1. Si es igual, lo hemos encontrado.2. Si es menor, se busca en el subárbol
izquierdo.3. Si es mayor, se busca en el subárbol
derecho.
Admite una definición recursiva:
Casos base:◦ Si el árbol es nulo, el elemento no está.◦ Si se trata del elemento raíz, el elemento ya se ha encontrado.
Casos generales:◦ Si el elemento es menor que el raíz hay que hacer la búsqueda en
el subárbol izquierdo (llamada recursiva).◦ Si el elemento es mayor, hay que hacer la búsqueda en el
subárbol derecho (llamada recursiva).
La función de búsqueda devolverá un árbol, es decir unpuntero a nodo.
Si el elemento está en el árbol, será la dirección del nododónde se encuentra el elemento buscado.
Si el elemento no está en el árbol, devolverá un puntero nulo.
En un árbol binario de búsqueda, todos los elementosse insertan como hojas.
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 correspondepara que el árbol resultante siga siendo de búsqueda.
3. Inserción en la posición encontrado. Se modifican demodo adecuado los enlaces de la estructura.
Existen cuatro distintos escenarios:
1. Intentar eliminar un nodo que no existe.– No se hace nada, simplemente se regresa FALSE.
2. Eliminar un nodo hoja.– Caso sencillo: se borra el nodo y se actualiza el apuntador del nodo
padre a NULL.
3. Eliminar un nodo con un solo hijo.– Caso sencillo; el nodo hijo se convierte en el padre.
4. Eliminar un nodo con dos hijos.– Caso complejo, es necesario mover más de una referencia.– Se busca el máximo de la rama izquierda o el mínimo de la ramaderecha.
6
2 8
3
1 4
6
2 8
3
1 4
Eliminar nodo hojaEliminar 3
Eliminar nodo con un hijoEliminar 4
6
2 8
3
1 4
5
6
3 8
3
1 4
5
eliminar
copiar
valor
Eliminar nodo con dos hijos
Eliminar 2
Remplazar el dato del nodo que se desea eliminar con el dato del nodo más pequeño del subárbol derechoDespués, eliminar el nodo más pequeño del subárbol derecho (caso fácil)
6
2 8
3
1 4
5
3.5
Eliminar nodo con dos hijosEliminar 2
6
3 8
3
1 4
5
3.5