Professional Documents
Culture Documents
Luis (bisabuelo) Micaela (hermana) Lucas (abuelo) Luis (padre) Victoria (hija) Graciela (hija) Mara (hermana) Juana Mara (hermana) Luis (hijo)
B C D E A h raz
UNIDAD VI
A B D G E H C
RBOLES
B E F C D G
A B C D E F
CONTENIDO
INTRODUCCIN RBOLES GENERALES RBOLES BINARIOS ESTRUCTURA DE UN RBOL BINARIO OPERACIONES EN RBOL BINARIO RBOLES DE EXPRESIN RECORRIDO DE UN RBOL RBOL BINARIO DE BUSQUEDA OPERACIONES RBOL BINARIO DE BUSQUEDA 2
G H I
A B C D E
A B D E G H C F
A B C D E F
INTRODUCCIN
El rbol es una estructura de datos muy importante en informtica y en ciencias de la computacin. Los rboles son estructuras no lineales, al contrario que los arreglos y las listas enlazadas. Son muy utilizados en informtica para representar frmulas algebraicas como un mtodo eficiente para bsquedas grandes y complejas, y en aplicaciones diversas tales como la inteligencia artificial o algoritmos de cifrado. Casi todos los sistemas operativos almacenan sus archivos en rboles. Tambin se utilizan en diseo de compiladores, procesadores de texto 3 y
G H I
A B C D E
A B D E G H C F
A B C D E F
RBOLES GENERALES
El concepto de rbol implica una estructura en la que los datos se organizan de modo que los elementos de informacin estn relacionados entre s a travs de ramas.
G H I
A B C D E
A B D E G H C F
A B C D E F
Ejemplo tpico
Luis (bisabuelo)
G H I
A B C D E
Micaela (hermana)
A B D E G H C F
Victoria (hija)
Grecia (hija)
A B C D E F
Ejemplo tpico
Presidente
G H I
Director gerente
A B C D E
Director de marketing
Director de informtica
Director financiero
Director de mantenimiento
Director de software
Director de internet
Ingeniero de software
A B D E G H C F
Analista
Programador
A B C D E F
Terminologa
rbol: Conjunto finito de elementos. Raz : Es el primer nodo insertado. Nodo: Elemento de un rbol. Rama o arco: lnea dirigida que conecta los nodos. Nodo Padre: Nodo que tiene nodo(s) sucesores. Nodo Hijo: Nodo que tiene un
G H I
A B C D E
A B D E G H C F
A B C D E F
Terminologa
Nodo Hoja: Nodo sin hijos o nodo terminal. Nivel: Distancia a la raz. Altura o profundidad: Es el nivel de la hoja del camino ms largo desde la raz ms uno. Subrbol: Cualquier estructura conectada por debajo de la raz.
8
G H I
A B C D E
A B D E G H C F
A B C D E F
Terminologa
Nodos hermanos: Los nodos que tienen el mismo padre. Camino: Es una secuencia de nodos (desde la raz hasta el nodo deseado). Grado del nodo: Nmero de ramas asociadas.
G H I
A B C D E
A B D E G H C F
A B C D E F
Terminologa
G H I
Nivel 0
A B C D E
raz
Nivel 1
Rama FI
Nivel 2
10
A B C D E F
Terminologa
Definicin recursiva de un rbol Un rbol es un conjunto de nodos que: 1. O bien es vaco, o bien 2. Tiene un nodo determinado llamado raz, del que jerrquicamente desciende cero o ms subrboles, que son tambin rboles.
11
G H I
A B C D E
A B D E G H C F
A B C D E F
Representacin de un rbol
En niveles de profundidad: es utilizado para representar sistemas jerrquicos en modo texto o nmero en situaciones tales como facturacin, gestin de stocks en almacenamiento, etc.
G H I
A B C D E
A B D E G H C F
12
A B C D E F
G H I
B
F
A B C D E
C D E F
13 I
A B D E G H C F
G H I
13
A B C D E F
Representacin de un rbol
De lista: se representa mediante parntesis.
G H I
A B C D E
A B C D E F
I 14
A B D E G H C F
14
A B C D E F
RBOLES BINARIOS
Un rbol binario es un rbol en el que ningn nodo puede tener ms de dos subrboles. En un rbol binario, cada nodo puede tener cero, uno o dos hijos (subrboles).
A B C D E D G B E H A C F A B A B C A C B A
G H I
A B C D E
A B D E G H C F
A B
15
A B C D E F
RBOLES BINARIOS
G H I
A B C D E
Hijo izquierdo
A
Hijo derecho
A B D E G H C F
16
A B C D E F
RBOLES BINARIOS
Un rbol binario se divide en tres subconjunto disjuntos:
G H I
A B C D E
A B D E G H C F
Subrbol izquierdo de R
Subrbol derecho de R
17
A B C D E F
Equilibrio
Equilibrio: Para determinar si un rbol est equilibrado, se calcula el factor de equilibrio de cada nodo.
G H I
A B C D E
A B D E G H C F
El factor de equilibrio de un nodo en un rbol binario es la diferencia entre la altura del subrbol derecho (HD) y la altura 18 del subrbol izquierdo (HI). fe(B)
A B C D E F
Equilibrio
A B C
G H I
fe(A)= 4 0 = 4
A B C E
A B C D E A B B D A B D E G H C F G H E C A D
fe(A)= 2 0 = 2
fe(A)= 1 1 = 0
C
fe(A)= 2 3 = -1
19
A B C D E F
G H I
A B C D E
A B D E G H C F H
20
A B C D E F
G H I
A B C D E
A B D E G H C F
A B C D E F
RBOLES BINARIOS
En un rbol degradado, existe un solo nodo hoja y cada nodo no hoja slo tiene un hijo (equivalente a una lista enlazada).
A B C D
G H I
A B C D E
A B D E G H C F
22
A B C D E F
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 punteros o referencia, referencia uno al subrbol izquierdo y otro al subrbol derecho, que se conocen como rama izquierda (izquierdo, izqdo) y rama derecha (derecho, dcho) respectivamente. Un valor null 23 indica un rbol vaco.
G H I
A B C D E
A B D E G H C F
A B C D E F
G H I
A B C D E
A B D E G H C F
A B C D E F
G H I
A B C D E
rbol
izqdo
dcho
izqdo
dcho
izqdo
dcho
izqdo
dcho
izqdo
dcho
A B D E G H C F
izqdo
dcho
izqdo
dcho
25
A B C D E F
Representacin en Java
Los nodos de un rbol se representan en una clase. Se supone que el nodo tiene los campo dato, izda (rama iaquierda) y dcha (rama derecha). El constructor inicializa el dato a un elemento y los apuntadores izda y dcha a null. Otro constructor inicializa todos los elementos del nodo a null. El tipo de dato se generaliza con la clase 26 base Object.
G H I
A B C D E
A B D E G H C F
A B C D E F
Clase Nodo
package arbolBinario; public class Nodo { Object dato; Nodo izda, dcha; public Nodo(Object x){ dato = x; izqda = dcha = null; } public Nodo(){ dato = null; izqda = dcha = null; }
G H I
A B C D E
A B D E G H C F
27
A B C D E F
G H I
A B C D E
A B D E G H C F
A B C D E F
G H I
A B C D E
A B D E G H C F
A B C D E F
G H I
A B C D E
A B D E G H C F
A B C D E F
Tarea
Que genera el siguiente cdigo
Arbol ar, a1, a2; Pila pila = new Pila(); ar = a1 = a2 = new Arbol(); a1.nuevoArbol(null,Maria,null); a2.nuevoArbol(null,Rodrigo,null); ar.nuevoArbol(a1,Esperanza,a2); pila.insertar(ar); a1.nuevoArbol(null,Alondra,null); a2.nuevoArbol(null,Abel,null); ar.nuevoArbol(a1,Arturo,a2); pila.insertar(ar); a2 = pila.quitar(); a1 = pila.quitar(); ar.nuevoArbol(a1, Alicia,a2);
31
G H I
A B C D E
A B D E G H C F
A B C D E F
G H I
A B C D E
A B D E G H C F
Determinar su altura Determinar su numero de elementos Hacer Visualizar el rbol binario en pantalla o en impresora Determinar si dos rboles binarios son idnticos Borrar (eliminar el rbol) Si es un rbol de expresin, evaluar la expresin Si es un rbol de expresin, obtener la forma de parntesis de la expresin
32
A B C D E F
OPERACIONES EN RBOL BINARIO Todas estas operaciones se pueden realizar recorriendo el rbol binario de un modo sistemtico. El recorrido de un rbol es la operacin de visita al rbol, o lo que es lo mismo, la visita a cada nodo del rbol una vez y slo una.
33
G H I
A B C D E
A B D E G H C F
A B C D E F
RBOLES DE EXPRESIN
Una aplicacin muy importante de los rboles binarios son los rboles de expresin. Una expresin es una secuencia de tokens (componentes de lxicos que siguen unas reglas prescritas). Un token puede ser un operando o un operador. Un rbol de expresin es un rbol binario con las siguientes 34 propiedades:
G H I
A B C D E
A B D E G H C F
A B C D E F
RBOLES DE EXPRESIN
1. Cada hoja es un operando 2. Los nodos raz e internos son operadores 3. Los subrboles son subexpresiones en los que el nodo raz es un operador
+ * a + d
G H I
A B C D E
a * (b + c) + d
A B D E G H C F
A B C D E F
RBOLES DE EXPRESIN
Obsrvese que los parntesis no se almacenan en el rbol, pero estn implicados en la forma del rbol. Si se supone que todos los operadores tienen dos operandos, se puede representar una expresin por un rbol binario cuya raz contiene un operador y cuyos subrboles izquierdo y derecho son los operandos izquierdo y derecho respectivamente. Cada operando puede ser una letra (x, y, a, b, etc) o una subexpresin representada como un subrbol. 36
G H I
A B C D E
A B D E G H C F
A B C D E F
RECORRIDO DE UN RBOL
Para visualizar o consultar los datos almacenados en un rbol se necesita recorrer el rbol o visitar los nodos del mismo. Al contrario que las listas enlazadas, los rboles binarios no tienen realmente un primer valor, un segundo valor, tercer valor, etc. Se puede afirmar que la raz es el primero, pero quin viene a continuacin? Existen diferentes mtodos de recorrido de rbol, ya
37
G H I
A B C D E
A B D E G H C F
A B C D E F
RECORRIDO DE UN RBOL
que la mayora de las aplicaciones binarias son bastante sensibles al orden en el que se visitan los nodos, de forma que ser preciso elegir cuidadosamente el tipo de recorrido.
G H I
A B C D E
A B D E G H C F
Un recorrido de un rbol binario requiere que cada nodo del rbol sea procesado (visitado) una vez y slo una en una secuencia predeterminada. Existen dos enfoques generales para la secuencia de recorrido: profundidad y 38 anchura.
A B C D E F
G H I
A B C D E
A B D E G H C F
A B C D E F
Recorrido en profundidad
Dado un rbol binario que consta de un nodo raz, un subrbol izquierdo y un subrbol derecho, se pueden definir tres tipos de secuencia de recorrido en profundidad. La designacin adicional de los recurridos utiliza un nombre para el nodo raz (N), para el subrbol izquierdo (I) y para el subrbol derecho (D). Los recorridos se conocen como:
1. 2. 3. Preorden (preorder) Enorden (inorder) Postorden (postorder)
G H I
A B C D E
A B D E G H C F
40
A B C D E F
G H I
A B C D E
El recorrido preorden (NID) conlleva los siguientes pasos, en los que el nodo raz va antes que los subrboles:
A B D E G H C F
1. Recorrer el nodo raz (N). 2. Recorrer el subrbol izquierdo (I) en preorden. 3. Recorrer el subrbol derecho (D) en preorden.
41
A B C D E F
G H I
A B C D E
A B D E G H C F
A B C D E F
G H I
A B C D E D B
Camino A,B, D, E, C, F, G
1
C
2
E F
5
G
A B D E G H C F
43
A B C D E F
G H I
A B C D E
A B D E G H C F
public class Nodo { public void re_preorden() { System.out.prin(dato); if (izda != null) izda.re_preorden(); if (dcha != null) dcha.re_preorden(); } }
44
A B C D E F
G H I
A B C D E
A B D E G H C F
El recorrido en orden (inorder) procesa primero el subrbol izquierdo, despus el nodo raz y a continuacin el subrbol derecho. El significado de in es que la raz se procesa entre los subrboles. Si el rbol no est vaco, el mtodo implica los siguientes pasos:
1. Recorrer e subrbol izquierdo (I) en inorden.
45
A B C D E F
G H I
A B C D E
Camino D,B, E, A, F, C, G
4
A B D E G H C F D B C
2
E F
6
G
46
A B C D E F
G H I
A B C D E
public class Nodo { public void re_enorden(){ if (izda != null) izda.re_enorden(); System.out.prin(dato); if (dcha != null) dcha.re_enorden(); } }
47
A B D E G H C F
A B C D E F
G H I
A B C D E
El recorrido postorden (IDN) procesa el nodo raz (post) despus de que los subrboles izquierdo y derecho se han procesado. Las etapas del algoritmo son:
1. Recorrer e subrbol izquierdo (I) en postorden. 2. Recorrer el subrbol derecho (D) en postorden. 3. Visitar el nodo raz (N).
A B D E G H C F
48
A B C D E F
G H I
A B C D E
A B D E G H C F D
3
E F
6
G
49
A B C D E F
G H I
A B C D E
public class Nodo { public re_postorden(){ if (izda != null) izda.re_postorden(); if (dcha != null) dcha.re_postorden();
void
A B D E G H C F
System.out.prin(dato); } }
50
A B C D E F
G H I
A B C D E
A B D E G H C F
A B C D E F
G H I
A B C D E
A B D E G H C F
52
A B C D E F
G H I
A B C D E
A B D E G H C F
A B C D E F
G H I
A B C D E
A B D E G H C F
A B C D E F
G H I
A B C D E
12 8 7 14 16
A B D E G H C F
55
A B C D E F
G H I
A B C D E
A B D E G H C F
56
A B C D E F
G H I
A B C D E
class NodoUniversitario { int numMat; String nombre; NodoUniversitario izqda; NodoUniversitario dcha; public NodoUniversitario(int nom) { numMat = mat; nombre = nom; izda = dcha = null; } } mat, String
A B D E G H C F
57
A B C D E F
G H I
A B C D E
A B D E G H C F
58
A B C D E F
Bsqueda
La bsqueda de un nodo con una cierta clave comienza en el nodo raz y sigue estos pasos:
G H I
A B C D E
A B D E G H C F
1. La clave buscada se compara con la clave del nodo raz. 2. Si las claves son iguales, la bsqueda se detiene. 3. Si la clave buscada es mayor que la clave raz, la bsqueda se reanuda en el subrbol derecho. Si la clave buscada es menor que la clave raz, la bsqueda se reanuda con el subrbol izquierdo.
59
A B C D E F
Bsqueda
// clase ArbolBusqueda public boolean buscar(int buscado){ if (raiz != null) return (raiz.buscarNodo(buscado) != null); else return false; }
// clase NodoUniversitario public NodoUniversitario buscarNodo(int buscado){ if (buscado == numMat) return this; else if (buscado < numMat) if (izda != null) return izda.buscarNodo (buscado); else return nuli; else if (buscado > numMat) if (dcha != null) return dcha.buscarNodo (buscado); else return null; }
G H I
A B C D E
A B D E G H C F
60