Sunteți pe pagina 1din 34

1 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

7.

RBOLES
Analiza: Ejemplos donde se aplican los rboles: son los sistemas de ficheros, diagrama modular, eliminatorias deportivas, organigramas de empresas etc, etc Piensa en otras aplicaciones informticas de la vida real, en donde se utilice la estructura: Arbol, comenta con tus compaeros y con tu profesora..!!!

7.1. Introduccin

Los rboles tienen una gran variedad de aplicaciones. Por ejemplo, se pueden utilizar para representar frmulas matemticas, para organizar adecuadamente la informacin, para construir un rbol genealgico, para el anlisis de circuitos elctricos y para numerar los captulos y secciones de un libro. Los rboles representan las estructuras no lineales y dinmicas de datos ms importantes en computacin. Dinmicas porque las estructuras de rbol pueden cambiar durante la ejecucin de un programa. No lineales, puesto que a cada elemento del rbol pueden seguirle varios elementos. Los rboles pueden ser construidos con estructuras estticas y dinmicas. Las estticas son arreglos, registros y conjuntos, mientras que las dinmicas estn representadas por listas. La definicin de rbol es la siguiente: Es una estructura jerrquica aplicada sobre una coleccin de elementos u objetos llamados nodos; uno de los cuales es conocido como raz. Adems se crea una relacin o parentesco entre los nodos dando lugar a trminos como padre, hijo, hermano, antecesor, sucesor, ancestro, etc. Formalmente se define un rbol de tipo T como una estructura homognea que es la concatenacin de un elemento de tipo T junto con un nmero finito de rboles disjuntos, llamados subrbols. Una forma particular de rbol puede ser la estructura vaca. Terminologa bsica de la Estructura rbol

2 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

Raz: nico nodo que no tiene antecesor, es decir, sin padre. Rama: arista formado entre dos nodos. Antecesor: un nodo X es el antecesor de un nodo Y si por alguna de las ramas de X se puede llegar a Y. Sucesor: un nodo X es sucesor de un nodo Y si por alguna de las ramas de Y se puede llegar a X. Grado de un nodo: nmero de descendientes directos que tiene un nodo. Grado del rbol: es el mayor grado entre sus nodos. Nodo interno: es aquel que tiene al menos un descendiente o nodo hijo. Nodo hoja (externo): nodo que no tiene descendientes o no tiene nodos hijos, posee grado 0. Descendiente directo: hijo Descendientes: hijo, nieto... Subrbol: rbol formado por un nodo y sus descendientes

rbol binario: rbol de grado 2, en donde cada nodo tiene como mucho dos descendientes directos. rbol multicamino: Cada nodo puede tener n descendientes directos. Lista: rbol degenerado de grado 1. Nivel: nmero de ramas que hay que recorrer para llegar de la raz a un nodo; la raz siempre tiene un nivel de 0. Profundidad de un nodo: nmero de predecesores.

3 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

Altura del rbol: profundidad mxima de cualquier nodo o el nivel ms alto del rbol ms

Camino: Existe un camino del nodo X al nodo Y, o si existe una sucesin de nodos que permitan llegar desde X a Y.

Formas de representar un rbol 1. Mediante un grafo:

4 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

Se utiliza la recursin para definir un rbol porque representa la forma ms apropiada y porque adems es una caracterstica inherente de los mismos. 2. Mediante un diagrama encolumnado:

A continuacin veremos en java como se puede declarar una estructura de datos bsica (se indicar solamente atributos) para un rbol cualesquiera. class NodoArbol { int dato; // informacin del nodo // es un arbol con ramas de hasta 3; NodoArbol nodo1, nodo2, nodo3; // si queremos ms ramas deberamos declarar un array de // objetos de tipo NodoArbol o utilizar Collections, // Vector, ArrayList, que son propias de Java. ..... // Constructor y mtodos propios del nodo. }

Importante: En java tambin existe un api propio para trabajar con rboles tanto en forma visual como es la clase javax.swing.JTree y todo el paquete javax.swing.tree, as como tambin clases no visuales como java.util.TreeMap y java.util.TreeSet INVESTIGA..!!!

7.2.

rboles binarios Analiza: Algunas aplicaciones de los rboles binarios pueden ser: expresiones aritmticas, rboles de decisin, bsqueda (ABB). Piensa en otras aplicaciones informticas de la vida real, en donde se utilice la estructura: Arbol Binario, comenta con tus compaeros y con tu profesora..!!!

A continuacin se muestra un ejemplo de rbol binario para expresiones aritmticas, donde los nodos internos son los operadores y los nodos hojas son los operandos.

5 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

Un rbol Binario es como un conjunto finito de elementos que bien est vaco o est formado por una raz con dos rboles binarios disjuntos, llamados subrbol izquierdo y derecho de la raz. Las aplicaciones de los arboles binarios son muy variadas ya que se les puede utilizar es para representar una estructura en la cual es posible tomar decisiones con dos opciones en distintos puntos. La representacin grfica de un rbol binario es la siguiente:

Terminologa bsica rboles binarios Nodo raz: es el primer elemento de un rbol binario; un rbol binario slo tiene un nodo raz. Nodo padre: son los nodos que tienen al menos un hijo (derecho y/o izquierdo). Hijo derecho: nodo que se encuentra al lado derecho de otro nodo. lado Hijo izquierdo: nodo que est al lado izquierdo de otro nodo. Nodo hoja: nodos que no tienen hijos. (Un nodo de un rbol binario puede tener ninguno, uno o dos hijos.) Nodo hermano: nodos que tienen un mismo padre. Ancestros: nodo padre de un nodo o el padre de algn nodo ancestro. (El nodo raz adre es un ancestro de todos los nodos del rbol.) Nodo descendiente: el hijo de un nodo o el hijo de otro descendiente de ese nodo. (Todos los nodos del rbol son descendientes del nodo raz.) Subrbol izquierdo: todos los descendientes por la izquierda de un nodo forman un subrbol izquierdo, cuya raz es el hijo izquierdo de ese nodo. Subrbol derecho: todos los descendientes por la derecha de un nodo forman un subrbol derecho, cuya raz es e hijo derecho de ese nodo. el Nivel de un nodo: distancia desde la raz. La raz est en el nivel ce Cantidad de cero. nodos por los que se tiene que pasar para llegar a un nodo. (El nmero mximo de nodos en el nivel n es 2".)

6 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

Propiedades de los rboles bi binarios

Representacin en Memoria Hay dos formas tradicionales de representar un rbol binario en memoria: Por medio de datos tipo punteros tambin conocidos como variables dinmicas o listas. Por medio de arreglos. Sin embargo la ms utilizada es la primera, puesto que es la ms natural para tratar este tipo de estructuras.

Los nodos del rbol binario sern representados como registros que contendrn como mnimo tres campos. En un campo se almacenar la informacin del nodo. Los dos restantes se utilizarn para apuntar al subarbol izquierdo y derecho del subarbol en lizarn cuestin.

Cada nodo se representa grficamente de la siguiente manera:

7 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

Operaciones bsicas de los rboles binarios

Operaciones Bsicas a) Recorrido de un rbol binario Existen dos formas de recorrer un rbol: Recorrido en amplitud: Consiste en ir visitando el rbol por niveles. Primero se visitan los nodos de nivel 0(como muchos hay uno, la raz), despus los nodos de nivel 1, as hasta que ya no quedan ms. Si se hace el recorrido del rbol siguiente quedar: 4, 2, 6, 5, 8 ecorrido

Recorrido en profundidad: Recorre el rbol por subrboles. Y h tres maneras hay de recorrer un rbol: en inorden, preorden y postorden. Cada una de ellas tiene una secuencia distinta para analizar el rbol como se puede ver a continuacin: rbol

8 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

1.

PREORDEN Consiste en visitar el nodo actual (visitar puede ser simplemente mostrar la posicin del nodo por pantalla), y despus visitar el subrbol izquierdo y una vez visitado, visitar el subrbol derecho Presorden: 4, 2, 6, 5, 8

2.

INORDEN Se visita el subrbol izquierdo, el nodo actual y luego se visita el subrbol derecho. Inorden: 2, 4, 5, 6, 8

POSTORDEN Se visita primero el subrbol izquierdo, despus el derecho y por ltimo el nodo actual. Postorden: 2, 5, 8, 6, 4 b) Insercin La insercin tampoco es complicada. Es ms, resulta prcticamente idntica a la bsqueda. Cuando se llega a un rbol vaco se crea el nodo en el puntero que se pasa como parmetro por referencia, de esta manera los nuevos enlaces mantienen la coherencia. Si el elemento a insertar ya existe entonces no se hace nada. c) Borrado La operacin de borrado si resulta ser algo ms complicada. Se recuerda que el rbol debe seguir siendo de bsqueda tras el borrado. Pueden darse tres casos, una vez encontrado el nodo a borrar: 1) El nodo no tiene descendientes. Simplemente se borra. 2) El nodo tiene al menos un descendiente por una sola rama. Se borra dicho nodo, y su primer descendiente se asigna como hijo del padre del nodo borrado.
Ejemplo de recorridos en la siguiente expresin aritmtica: 2 x (a-1)+(3xb), sin parntesis.

3.

9 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

TDA: ARBOL BINARIO Elementos: guarda un conjunto de nodos. Cada uno de ellos contiene un dato homogneo (simple o estructurado) nico en el rbol. Estructura: La organizacin de los datos es una estructura en forma jerrquica o de niveles, restringiendo la relacin de uno a dos como mximo, sin cumplir ordenamiento alguno. Dominio: Depende de la aplicacin OPERACIONES: - INSERCIN Utilidad: Inserta un nuevo elemento dentro del rbol binario Datos de entrada: el rbol b, donde se va a insertar, y el nuevo elemento e Datos de salida: el rbol b, tiene un nuevo elemento insertado como hoja Precondicin: el rbol b existe y el elemento e no est en el rbol Postcondicin: el rbol b contiene al elemento nuevo insertado como una hoja - ELIMINACIN Utilidad: elimina un elemento dentro del rbol binario Datos de entrada: el rbol b, donde se va a eliminar, y el elemento o dato a eliminar Datos de salida: regresa falso si el dato no se encuentra en el rbol; verdadero si lo encontr y lo pudo eliminar, en cuyo caso, regresa el rbol modificado. Precondicin: el rbol b existe y el elemento o dato est en el rbol Postcondicin: el rbol b contiene al elemento menos. - BUSCAR Utilidad: busca un elemento dentro del rbol binario Datos de entrada: el rbol b, donde se va a buscar, y el nuevo elemento e por localizar Datos de salida: regresa falso si el valor no se encuentra en el rbol y un apuntador p almacenar la posicin dentro del rbol donde est el valor. Precondicin: el rbol b existe Postcondicin: ninguna. - RECORRER Utilidad: despliega los elementos almacenados en un rbol binario Datos de entrada: el rbol b a desplegar y el orden en que se desplegarn los elementos Datos de salida: cada nodo en el rbol se procesa exactamente una vez. El orden en el que se procesarn los nodos depende del valor del orden. Si el orden es: PreOrden: raz-subrbol izquierdo-subrbol derecho PostOrden: subrbol izquierdo-subrbol derecho-raz InOrden: subrbol izquierdo-raz-subrbol derecho. Precondicin: el rbol b existe Postcondicin: ninguna. Clasificacin Existen cuatro tipos de rbol binario: A. B. Distinto. A. B. Similares. A. B. Equivalentes. A. B. Completos.

10 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

B. Distinto Se dice que dos rboles binarios son distintos cuando sus estructuras son diferentes.

A. B. Similares Dos rboles binarios son similares cuando sus estructuras son idnticas, pero la informacin que contienen sus nodos es diferente.

A. B. Equivalentes Son aquellos arboles que son similares y que adems los nodos contienen la misma informacin.

A. B. Completos Son aquellos arboles en los que todos sus nodos excepto los del ltimo nivel, tiene dos hijos; el subarbol izquierdo y el subarbol derecho.

Implementacin de Arboles binarios IMPLEMENTACIN: CLASE NODO: public class Nodo { //atributos int dato; public Nodo izq; public Nodo der; /** Creates a new instance of Nodo */ public Nodo(int d) {

11 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

dato=d; izq=der=null; } } CLASE ARBOL: package arbolesb; /** * * @author Ing. Mireya Erreyes */ public class Arbol { //Atributos public Nodo raiz; public int lado=0; /** Creates a new instance of Arbol */ public Arbol() { raiz=null; } public synchronized void insertar(int d){ //si el arbol esta vacio if (raiz==null){ raiz = new Nodo(d); }else{ incluye(raiz,d); } } public synchronized void incluye(Nodo r, int d){ if(lado==0){ if(r.izq==null){ r.izq=new Nodo(d); lado=1; }else{ incluye(r.izq,d); } }else{ if(r.der==null){ r.der=new Nodo(d); lado=0; }else{ incluye(r.der,d); } } } public synchronized void recorridoPreOrden(){ preorden(raiz); } public static void preorden(Nodo r){ if(r !=null){ System.out.print(r.dato+ " "); preorden(r.izq);

12 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

preorden(r.der); } } public synchronized void recorridoInOrden(){ inorden(raiz); } public static void inorden(Nodo r){ if(r !=null){ inorden(r.izq); System.out.print(r.dato+ " "); inorden(r.der); } } public synchronized void recorridoPosOrden(){ posorden(raiz); } public static void posorden(Nodo r){ if(r !=null){ posorden(r.izq); posorden(r.der); System.out.print(r.dato+ " "); } } } 7.3.rboles binarios de bsqueda (ABB) TDA: ARBOL BINARIO DE BSQUEDA Elementos: guarda un conjunto de nodos. Cada uno de ellos contiene un dato homogneo (simple o estructurado) nico en el rbol. Estructura: La organizacin de los datos es una estructura en forma jerrquica o de niveles, restringiendo la relacin de uno a dos como mximo, sin cumplir ordenamiento alguno. Dominio: Depende de la aplicacin OPERACIONES: - INSERCIN Utilidad: Inserta un nuevo elemento dentro del rbol bb Datos de entrada: el rbol b, donde se va a insertar, y el nuevo elemento e Datos de salida: el rbol b, tiene un nuevo elemento insertado como hoja Precondicin: el rbol b existe y el elemento e no est en el rbol Postcondicin: el rbol b contiene al elemento nuevo insertado como una hoja - ELIMINACIN Utilidad: elimina un elemento dentro del rbol bb Datos de entrada: el rbol b, donde se va a eliminar, y el elemento o dato a eliminar Datos de salida: regresa falso si el dato no se encuentra en el rbol; verdadero si lo encontr y lo pudo eliminar, en cuyo caso, regresa el rbol modificado. Precondicin: el rbol b existe y el elemento o dato est en el rbol Postcondicin: el rbol b contiene al elemento menos. - BUSCAR

13 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

Utilidad: busca un elemento dentro del rbol bb Datos de entrada: el rbol b, donde se va a buscar, y el nuevo elemento e por localizar Datos de salida: regresa falso si el valor no se encuentra en el rbol y un apuntador p almacenar la posicin dentro del rbol donde est el valor. Precondicin: el rbol b existe Postcondicin: ninguna. RECORRER Utilidad: despliega los elementos almacenados en un rbol bb Datos de entrada: el rbol b a desplegar y el orden en que se desplegarn los elementos Datos de salida: cada nodo en el rbol se procesa exactamente una vez. El orden en el que se procesarn los nodos depende del valor del orden. Si el orden es: PreOrden: raz-subrbol izquierdo-subrbol derecho PostOrden: subrbol izquierdo-subrbol derecho-raz InOrden: subrbol izquierdo-raz-subrbol derecho. Precondicin: el rbol b existe Postcondicin: ninguna.

Ejemplo de recorridos en la siguiente expresin aritmtica: 2 x (a-1)+(3xb), sin parntesis.

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. Tambin, se denominan arboles binarios de bsqueda, debido a que se pueden buscar en ellos un valor utilizando un algoritmo de bsqueda binaria similar al empleado en arrays. Los rboles de bsqueda se pueden utilizar como diccionarios y como colas de prioridad. Propiedad de un rbol bsqueda binaria

14 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

Sea x un nodo en un rbol de bsqueda binaria. Si y es un nodo del sub-rbol izquierdo de x, entonces la clave de y tiene que ser a la clave de x. Si z es un nodo del sub-rbol derecho de x, entonces la clave de x tiene que ser a la clave de z. La propiedad del rbol de bsqueda nos permite imprimir o recorrer sus nodos en el orden de sus claves haciendo uso de un simple algoritmo recursivo. Ejemplo: Construya un rbol binario de bsqueda para la siguiente lista de nmeros: 65, 75, 30, 4, 41, 85. rbol binario de bsqueda para nodos con el campo de datos de tipo int. 30 menor que 55 41 mayor que 30 75 mayor que 55 85 mayor que 75 4 menor que 30
4 55

30

75

41

85

Claves y valores Si los rboles binarios de bsqueda estn ordenados, deben estarlo segn alguna clave incluida en cada nodo del rbol. Un nodo puede contener nicamente la clave, pero suele resultar til permitir que cada nodo contenga una clave y un valor. Pueden ser de cualquier clase que desee, pero todos los nodos deben contener claves y valores que sean instancias de la misma clase. La clave se utiliza para analizar el nodo. El valor es un dato adicional del nodo indexado por la clave. Las estructuras de datos con pares clave/valor suelen recibir el nombre de mapas. Como ejemplo, consideramos las entradas de una agenda de telfonos tal como se insertaran en un rbol binario de bsqueda. El apellido del abonado sera la clave y el nmero de telfono sera el valor. Una ventaja fundamental de los rboles de bsqueda es que son en general mucho ms rpidos para localizar un elemento que una lista enlazada. Por tanto, son ms rpidos para insertar y borrar elementos. Si el rbol est perfectamente equilibrado esto es, la diferencia entre el nmero de nodos del subrbol izquierdo y el nmero de nodos del subrbol derecho es a lo sumo 1, para todos los nodos- entonces el nmero de comparaciones necesarias para localizar una clave es aproximadamente de logN en el peor caso. Adems, el algoritmo de insercin en un rbol binario de bsqueda tiene la ventaja sobre los arrays ordenados, donde se empleara bsqueda dicotmica para localizar un

15 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

elemento de que no necesita hacer una reubicacin de los elementos de la estructura para que esta siga ordenada despus de la insercin. Dicho algoritmo funciona avanzando por el rbol escogiendo la rama izquierda o derecha en funcin de la clave que se inserta y la clave del nodo actual, hasta encontrar su ubicacin. El algoritmo de borrado en rboles es algo ms complejo, pero ms eficiente que el de borrado en un array ordenado. Eficacia de la bsqueda binaria Parece intuitivo pensar que las operaciones bsicas del rbol binario de bsqueda deberan requerir un tiempo O (h), donde h es la altura del rbol. Pero se deduce que la altura de un rbol binario equilibrado es, aprox., log2(n), donde n es el nmero de elementos si el rbol permanece equilibrado. Se puede demostrar que, si las claves se insertan aleatoriamente en un rbol binario de bsqueda, esta condicin se cumplir y que el rbol permanecer lo suficientemente equilibrado para que la hora de bsqueda y de insercin sea aproximadamente O (log n).

Creacin de un rbol binario de bsqueda Para crear un rbol binario de bsqueda consideramos el siguiente ejemplo: Se desea 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 el nodo actual; inicialmente el nodo estn vaco y se desea insertar el 8. La nica opcin es almacenar el nodo en la raz:
8

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

A continuacin se debe insertar 1, ya que es menor que 8 y que 3, ir a la izquierda y debajo de 3.


8

El siguiente nmero es 20, mayor que 8, por lo tanto ir a la derecha de ste nmero:

16 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

3 20

Cada nuevo elemento se inserta como una nueva hoja del rbol. El resto de elementos se pueden situar fcilmente, lo cual se muestra en las siguientes figuras:

3 20

20

10

10

20

10

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.

17 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

Operaciones en un ABB

1. Insertar un nodo Una caracterstica fundamental que debe poseer el algoritmo de insercin es que el rbol resultante de una insercin en un rbol de bsqueda tambin ha de ser de bsqueda. El algoritmo de insercin se apoya en la localizacin de un elemento, de modo que si se encuentra el elemento (clave) buscado, no es necesario hacer nada, en caso contrario se inserta el nuevo elemento justo en el lugar donde se acabado la bsqueda(Es decir donde hacia estado en el estado de existir) existir). La interseccin de un nuevo nodo en un rbol de bsqueda siempre se hace en como nodo hoja. Para ello se baja por el rbol segn el camino de bsqueda. Por ejemplo: supongamos que queremos construir un ABB a partir del conjunto de enteros {10, 5, 14, 7,12} aplicando reiteradamente el proceso de insercin. El resultado es el que muestra la figura

18 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

2. Funcin de insertar Se debe declarar dos argumentos un puntero a la raz del rbol y el dato que tendr el nodo. La funcin creara un nuevo nodo y lo inserta en el lugar correcto nuevo en el rbol de modo que el rbol permanezca como binario de bsqueda. Los pasos a seguir son: 1.- Asignar memoria para una nueva estructura nodo nodo. 2.- Buscar en el rbol para encontrar la posicin de interseccin del nuevo nodo, que se colocara como nodo hoja hoja. 3.- Enlazar el nuevo nodo al rbol. 3. Eliminacin La operacin de borrado si resulta ser algo ms complica debido a que el elemento a borrar puede ser cualquier. Se recuerda que el rbol debe seguir siendo de bsqueda tras el borrado. Pueden darse tres casos, una vez encontrado e el nodo a borrar:

hoja: Caso 1: Borrar un nodo sin hijos nodo hoja simplemente se borra y se establece a nulo el apuntador de su padre. Antes Despus

Ejemplo: En el rbol de ejemplo, borrar el nodo 3. 1. Localizamos el nodo a borrar, al tiempo que mantenemos un puntero a 'Padre'. 2. Hacemos que el puntero de 'Padre' que apuntaba a 'nodo', ahora apunte a NULL. 3. Borramos el 'nodo'.

19 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

Caso 2: El nodo es una hoja o tiene al menos un descendiente por una sola rama: Se borra dicho nodo, y su primer descendiente se asigna como hijo del padre del nodo borrado es decir asignar el enlace del nodo padre. En el rbol se borra el nodo cuya clave es -1. El rbol resultante es: 1. Antes Despus

Ejemplo: En el rbol de ejemplo, borrar el nodo 4. : 1. 2. 3. 4. 5. Localizamos el nodo a borrar ('raz'). Buscamos el nodo ms a la derecha del rbol izquierdo de 'raz', en este caso el 3, al tiempo que mantenemos un puntero a 'Padre' a 'nodo'. Intercambiamos los elementos 3 y 4. Hacemos que el puntero de 'Padre' que apuntaba a 'nodo', ahora apunte a NULL. Borramos el 'nodo'.

Caso 3: Borrar un nodo con dos subrboles hijo no vaca para mantener la vacas: estructura de rbol se pueden seguir dos alternativas: 1. Reemplazar el dato del nodo por la menor de las claves mayores en su subrbol derecho derecho. 2. Reemplazar el dato del nodo por la mayor de las clases menores en su subrbol izquierdo. Se elige la segunda para lo cual como las claves menores estn en la rama izquierda, se baja al primer nodo de la rama izquierda, y como la clave mayor est en la rama derecha, se contina bajando por la rama derecha hasta alcanzar el nodo hoja. Este es el mayor de los menores que reemplaza a la clave del nodo a eliminar. que

20 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

3. El nodo tiene al menos un descendiente por cada rama. Al borrar dicho nodo es necesario mantener la coherencia de los enlaces, adems de seguir manteniendo la estructura como un rbol binario de bsqueda. La solucin consiste en sustituir la informacin del nodo que se borra por el de una de las hojas, y borrar a continuacin dicha hoja. Puede ser cualquier hoja? No, debe ser la que contenga una de estas , dos claves: la mayor de las claves menores al nodo que se borra. Suponer que se quiere borrar el nodo 4 del rbol Se sustituir la clave 4 por la clave 2. la menor de las claves mayores al nodo que se borra. Suponer que se quiere borrar el nodo 4 del rbol. Se sustituir la clave 4 por la clave 5.

Ms ejemplos: 1. Eliminar el 5 2. Buscamos en menor de las claves mayores. 3. Intercambiamos el valor, y enlazamos el descendiente derecho.

Finalmente el rbol queda as:

Otro Ejemplo: En ste borraremos el elemento 6.

21 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

1. Localizamos el nodo a borrar ('raz'). 2. Buscamos el nodo ms a la izquierda del rbol derecho de 'raz', en este caso el 12, ya que el rbol derecho no tiene nodos a su izquierda, si o optamos por la rama izquierda, estaremos en un caso anlogo. Al mismo tiempo que mantenemos un puntero a 'Padre' a 'nodo'. 3. Intercambiamos los elementos 6 y 12. 4. Ahora tenemos que repetir el bucle para el nodo 6 de nuevo, ya que no podemos eliminarlo. 5. Localizamos de nuevo el nodo a borrar ('raz'). lizamos 6. Buscamos el nodo ms a la izquierda del rbol derecho de 'raz', en este caso el 16, al mismo tiempo que mantenemos un puntero a 'Padre' a 'nodo'. 7. Intercambiamos los elementos 6 y 16. 8. Hacemos que el puntero de 'Padre' que apuntaba a 'nodo', ahora apunte a NULL. 9. Borramos el 'nodo', observamos los pasos indicados en la siguiente figura. 'nodo', Antes Despus

Los recorridos en un ABB, es similar que en los rboles binarios Implementacin de Arboles BB package arbol; //definicion de la clase nodoArbol public class NodoArbol { //miembros de acceso del paquete NodoArbol nodoIzquierdo; int datos; NodoArbol nodoDerecho; //inicializar datos y hacer de este nodo un nodo hoja public NodoArbol(int datosNodo){ datos = datosNodo; nodoIzquierdo = nodoDerecho = null; // el nodo no tiene hijos }

22 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

public NodoArbol(){ datos = 0; nodoIzquierdo = nodoDerecho = null; // el nodo no tiene hijos } //localzar punto de inserccion e insertar nuevo nodo; ignorar valores duplicados public synchronized void insertar(int valorInsertar){ //insertar en subarbol izquierdo if (valorInsertar < datos){ //insertar nuevo NodoArbol if (nodoIzquierdo == null){ nodoIzquierdo = new NodoArbol(valorInsertar); } else //continuar recorriendo subarbol izquierdo nodoIzquierdo.insertar(valorInsertar); } //insertar en subarbol derecho else if(valorInsertar > datos){ //insertar nuevo nodoArbol if (nodoDerecho == null) nodoDerecho = new NodoArbol(valorInsertar); else//continuar recorriendo subarbol derecho nodoDerecho.insertar(valorInsertar); } }//fin del metodo insertar }//fin de la clase nodoArbol //definicion de la clase arbol

package arbol; public class Arbol { public NodoArbol raiz; //construir un objeto arbol vacio de enteros public Arbol(){ raiz = null; } //insertar un nuevo nodo en el arbol de busqueda binaria public synchronized void insertarNodo(int valorInsertar ){ if (raiz == null) raiz = new NodoArbol(valorInsertar); //crear el nodo raiz aqui else raiz.insertar(valorInsertar); //llamar al metodo insertar } //empezar recorrido preorden public synchronized void recorridoPreorden(){ ayudantePreorden(raiz); } //metodo recursivo para realizar rrecorrido postorden private void ayudantePreorden(NodoArbol nodo) { if(nodo==null){ return;

23 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

} System.out.print(nodo.datos+" ");//mostrar datos del nodo ayudantePreorden(nodo.nodoIzquierdo);//rrecorrer subarbol izquierdo ayudantePreorden(nodo.nodoDerecho);//rrecorrer subarbol Derecho } //empezar rrecorrido inorden public synchronized void recorridoInorden() { ayudanteInorden(raiz); } //metodo recursivo para realizar rrecorrido inorden private void ayudanteInorden(NodoArbol nodo) { if(nodo==null){ return; } ayudanteInorden(nodo.nodoIzquierdo);//rrecorrido subarbol izquierdo System.out.print(nodo.datos +" "); //mostrar datos del nodo ayudanteInorden(nodo.nodoDerecho); //rrecorrer subarbol derecho } //iniciar rrecorrido postorden public synchronized void recorridoPostorden() { ayudantePostorden(raiz); } //metodo recursivo para realizar rrecorrido postorden private void ayudantePostorden(NodoArbol nodo) { if(nodo==null){ return; } ayudantePostorden(nodo.nodoIzquierdo);//recorren subarbol izquierdo ayudantePostorden(nodo.nodoDerecho);//recorren subarbol Derecho System.out.print(nodo.datos +" "); //mostrar datos del nodo } public synchronized void ayudanteliminar(int dato){ eliminar(dato,this.raiz); } NodoArbol aux= this.raiz; NodoArbol aux1= this.raiz; public void eliminar(int dato,NodoArbol r){ if (r == null){ System.out.println("nodo no encontrado"); }else{ if(dato<r.datos){ if(r.nodoIzquierdo!=null){ if(r.nodoIzquierdo.datos==dato){ aux=r; }

24 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

} eliminar(dato,r.nodoIzquierdo); }else if(dato>r.datos){ if(r.nodoDerecho!=null){ if(r.nodoDerecho.datos==dato){ aux1=r; } } eliminar(dato,r.nodoDerecho); } else { NodoArbol q; q=r; if(q.nodoDerecho==null && q.nodoIzquierdo==null){ if(aux!=null){ aux.nodoIzquierdo=null; }else if(aux1!=null){ aux1.nodoDerecho=null; } }else{ reemplazar(q); } aux=this.raiz; aux1=this.raiz; System.out.println("se ha eliminado el elemento "); } } } public void reemplazar(NodoArbol at ){ NodoArbol a ,b; b=at ; a=at.nodoIzquierdo; while(a.nodoDerecho!=null){ b=a; a=a.nodoDerecho; } at.datos=a.datos; if(b==at){ b.nodoIzquierdo=a.nodoIzquierdo; }else b.nodoDerecho=a.nodoIzquierdo; at=a; } }

//este programa prueba la clase arbol package arbol;

25 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class PruebaArbol { public static void main(String []args)throws IOException{ InputStreamReader teclado=new InputStreamReader(System.in); BufferedReader lec=new BufferedReader(teclado); Arbol arbol=new Arbol(); int valor; System.out.println("Ingrese un numero de elementos para el arbol"); int num=Integer.parseInt(lec.readLine()); System.out.println("insertando los siguientes valores"); //insertar 10 enteros aleatorios del 0 al 99 en arbol for(int i=0;i<num;i++){ valor=(int)(Math.random()*100); if(i==0){ System.out.println("raiz: "+valor); } System.out.print(valor+" "); arbol.insertarNodo(valor); } System.out.println("\n\nRcorrido preorden"); arbol.recorridoPreorden();//realizar recorrido preorden de arbol System.out.println("\n\nRcorrido Inorden"); arbol.recorridoInorden();//realizar recorrido inorden de arbol System.out.println("\n\nRcorrido postorden"); arbol.recorridoPostorden();//realizar recorrido postorden de arbol boolean sigue=true; do{ System.out.println("ingrese un numero a eliminar"); int nomb=Integer.parseInt(lec.readLine()); arbol.eliminar(nomb,arbol.raiz); System.out.println("\n\nRcorrido Inorden"); arbol.recorridoInorden();//realizar recorrido inorden de arbol System.out.println("desea eliminar mas nodos"); String str=lec.readLine(); if(str.equals("no")){ sigue=false; } }while(sigue); } }//fin de la clase prueba arbol 7.4.rboles balanceados Se considera que un rbol binario esta balanceado cuando todos sus niveles, excepto el ultimo, estn integrados a la mxima capacidad de nodos.

26 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

Las investigaciones respecto a esta estructura de datos no han logrado encontrar una tcnica eficiente para manejar rboles de bsqueda completamente balanceados; las propuestas han llegado solo a presentar rboles parcialmente balanceados, sin repercutir en la eficiencia de las operaciones de insercin y eliminacin de nodos. La ms comn y usada de las tcnicas es la de los rboles AVL. Arbol AVL Un rbol AVL es un rbol binario de bsqueda que trata de mantenerse lo ms balanceado posible, conforme se realizan operaciones de insercin y eliminacin. Fueron propuestos en 1962 por los matemticos rusos Adelson-Velskii y Landis, de donde surge su nombre. Su contribucin principal consisti en presentar algoritmos eficientes de insercin y eliminacin de elementos considerando un balanceo en el rbol que, a su vez, repercute en la eficiencia de las bsquedas. Formalmente, en los rboles AVL se debe cumplir el hecho de que para cualquier nodo del rbol, la diferencia entre las alturas de sus subrboles no exceda una unidad

La especificacin del TDA rbol AVL es idntica a la del TDA rbol binario (ABB), y slo se considera un cambio en las postcondiciones de las operaciones de INSERTAR y BORRAR para obtener un rbol que cumpla con las restricciones de altura ya explicadas. TDA: ARBOL AVL Elementos: guarda un conjunto de nodos. Cada uno de ellos contienen un dato homogneo (simple o estruturado) nico en el rbol. Estructura: La organizacin de los datos es una estructura en forma jerrquica o de niveles, restringiendo la relacin de uno a dos como mximo, cumpliendo un orden y equilibrio. Dominio: Depende de la aplicacin OPERACIONES: - INSERCIN Inicialmente, el proceso de insercin de un elemento en un rbol AVL es idntico al de un ABB: se busca la posicin en el rbol en que el nuevo elemento

27 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

quede como un nodo hoja (puesto que el nuevo nodo es hoja, tendr un FB igual a cero). Una vez hecha la insercin como si fuera un ABB, se deber verificar si afecta el balanceo del rbol, segn las reglas de los AVL. El mejor de los casos ser cuando el nuevo nodo no provoque un desbalanceo, implicando slo la modificacin de los FB de los ancestros al nuevo nodo. El otro caso ser cuando ocurra un desbalanceo que obligue a hacer movimientos de apuntadores y de FB para balancearlo. La forma de detectar algortmicamente en qu caso se har o no un balanceo en el AVL, se basa en la bsqueda de un nodo pivote. Un nodo pivote es aquel que tiene un FB diferente de cero y es el ms cercano de los ancestros del nodo recin insertado. Basados en este concepto, se pueden detectar los siguientes casos: 1. El rbol AVL carece de nodo pivote. Esto significa que todos los ancestros del nuevo nodo tienen un PB igual a cero. En este caso, el nuevo nodo no desbalancea el rbol y slo se tendrn que ajustar los valores de los FB de todos los ancestros, volvindose positivos o negativos, segn el valor del nuevo elemento.

2. El rbol AVL tiene nodo pivote y el nuevo se ha insertado en el subrbol ms pequeo del pivote. En este caso tampoco habr desbalanceo, pues se igualan las alturas de los dos subrboles del nodo pivote, y slo se tendrn que ajustar los FB de los ancestros que estn a partir del nodo pivote, volvindose positivos o negativos segn el valor del nuevo elemento.

28 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

3. El rbol AVL tiene nodo pivote y en el subrbol ms grande de ste se inserta el nuevo nodo. En este caso se desbalancea el rbol a partir del nodo pivote y tendr que realizarse un balanceo. - ELIMINACIN Para eliminar un nodo de un rbol AVL se aplica inicialmente el algoritmo ya conocido para dar de baja un nodo en un ABB normal. Fsicamente, este algoritmo slo da de baja nodos que tienen un hijo o ninguno. Para el caso en que el nodo tiene dos hijos, se hace una sustitucin con algn nodo que no tenga hijos o que tenga uno, aplicando el mtodo de el mayor de los menores, o el de el menor de los mayores. Una vez dado de baja el nodo correspondiente, pueden ocurrir dos situaciones: 1. El nodo que se borr no provoc un desbalanceo en el rbol; en este caso, slo se ajustan algunos factores de balance. 2. El nodo que se borr provoc un desbalanceo en el rbol; en este caso, tendrn que ajustarse algunos apuntadores a travs de rotaciones y algunos factores de balance. A diferencia del procedimiento de insercin de un nodo, ahora no se utilizar un nodo pivote, pues una baja puede ocasionar un desbalanceo total en el rbol y ms de una rotacin. Al dar de baja un nodo se tendr que analizar el balanceo de todos los ancestros de la ruta de bsqueda, desde el padre del nodo borrado, hasta el nodo raz del rbol. Esto se debe a que pueden modificarse las alturas de los subrboles por el balanceo. Factor de balanceo Los nodos de un rbol AVL guardan un valor entre 1 y -1, lo que se conoce como Factor de Balance (FB), y representa la diferencia entre las alturas de sus subrboles. Un FB igual a cero en un nodo significa que las alturas de sus subrboles son iguales; Un FB positivo significa que el subrbol derecho es ms grande que el izquierdo, y Un FB negativo que el subrbol izquierdo es ms grande que el derecho.

29 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

Propiedad de los de arboles AVL La propiedad de equilibrio: que debe cumplir un rbol para ser AVL asegura que la profundidad del rbol sea O(log(n)), por lo que las operaciones sobre estas estructuras no debern recorrer mucho para hallar el elemento deseado. Como se ver, el tiempo de ejecucin de las operaciones sobre estos rboles es, a lo sumo O (log(n)) en el peor caso, donde n es la cantidad de elementos del rbol. Sin embargo, y como era de esperarse, esta misma propiedad de equilibrio de los rboles AVL implica una dificultad a la hora de insertar o eliminar elementos: estas operaciones pueden no conservar dicha propiedad. Balanceo en un arbol AVL Adelson-Velskii y Landis detectaron que, ante un problema de desbalance, todos los casos podan resolverse aplicando uno de los cuatro esquemas sencillos de balanceo; a estos esquemas los llamaron rotaciones (por la forma en que se mueven los nodos), y consisten en modificar los apuntadores de ciertos nodos, segn el esquema, junto con algunos FB. Lo ms valioso de esta propuesta es que el balanceo afecta slo los nodos que forman parte del subrbol, cuya raz es el nodo pivote, dejando intactos los nodos del resto del rbol. El esquema de la rotacin simple, que puede ser izquierda (RSI) o derecha (RSD) implica el movimiento de tres apuntadores y El esquema de la rotacin doble, que tambin puede ser izquierda (RDI) o derecha (RDD), implica el movimiento de cinco apuntadores. Tipos de rotaciones 1. Rotacin simple a la derecha (RD):Para ello debe cumplir con las siguientes condiciones: El subrbol izquierdo de un nodo sea 2 unidades ms alto que el derecho, es decir, cuando su FE sea de 2. Y adems, la raz del subrbol izquierdo tenga una FE de 1, es decir, que est cargado a la izquierda.

30 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

2.

Rotacin simple a la izquierda (RI): Para ello debe cumplir con las siguientes condiciones: El subrbol derecho de un nodo sea 2 unidades ms alto que el izquierdo, es decir, cuando su FE sea de -2. Y adems, la raz del subrbol derecho tenga una FE de -1, es decir, que est cargado a la derecha.

3. Rotacin compuesta derecha Izquierda (DI): Para ello se debe considerar lo siguiente: Cuando el subrbol izquierdo de un nodo sea 2 unidades ms alto que el derecho, es decir, cuando su FE sea -2. Y adems, la raz del subrbol izquierdo tenga una FE de 1, es decir, que est cargado a la derecha.

31 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

4. Rotacin compuesta Izquierda Derecha (ID) Se observa las siguientes (ID): condiciones: Cuando el subrbol derecho de un nodo sea 2 unidades ms alto que el izquierdo, es decir, cuando su FE sea 2. Y adems, la raz del subrbol derecho tenga una FE de -1, es decir, que est cargado a la izquierda.

A continuacin se presenta algunos ejemplos en donde se requiere, realizar algn tipo ejemplos de rotacin al momento de ejecutar la operacin de insercin de nodo en un rbol AVL. Rotacin simple a la izquierda. Ejemplo: Se insertara el nmero 3 a la derecha del nodo 2.

32 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

Rotacin simple a la derecha Ejemplo: Se inserta el nmero 17 a la izquierda del 22.

33 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

Rotacin doble de izquierda izquierda-derecha. Ejemplo: Se inserta el nmero 71 a la derecha del 29

Rotacin de derecha a izquierda izquierda. Ejemplo: Se inserta el nmero 39 a la izquierda del 48

34 Curso de Estructuras de Datos Orientada a Objetos Ing. Daysi M. Erreyes P.

Anlisis de eficiencia El anlisis matemtico de los algoritmos de insercin y eliminacin demuestran que es posible buscar, insertar y eliminar un elemento en un rbol balanceado de n nodos en O (logn) unidades de tiempo. Diversos anlisis demuestran que son ms frecuentes las rotaciones en las operaciones de insercin que en las de eliminacin. Mientras se produce aproximadamente una rotacin por cada dos inserciones, se produce una rotacin por cada cinco eliminaciones.

Exposicin Nro. 7 Profundizar en los siguientes temas de los rboles AVL: factor de 7: equilibrio, rotaciones, insercin, eliminacin, recorridos. Tendr disear el modelo e implementarlo en Java. Nota: Se tomar en cuenta el material de apoyo utilizado para la exposicin y debe entregar una copia digital a cada grupo, adems una copia impresa y digital a la profesora el da de la exposicin.

S-ar putea să vă placă și