You are on page 1of 60

A

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)

Lucas (abuelo) Luis (padre)

Mara (hermana) Juana (hermana) Luis (hijo)


5

A B D E G H C F

Victoria (hija)

Grecia (hija)

rbol genealgico (bisabuelobisnietos)

A B C D E F

Ejemplo tpico
Presidente

G H I

Director gerente
A B C D E

Director de marketing

Director de recursos humanos

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

Estructura jerrquica tipo rbol


6

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

Camino al nodo I: AFI A Padres: A, B, F B C Hijos: B, E, F, C, D, G, H,I D E F Grados de B: 2


G H

Hermanos: {B, E, F} , {C, D}, {G Hojas: C, D, E, G, H, I Profundidad: 3 Grados de F: 3 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

Ejemplo de rbol en nivel de profundidad


A
A

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

Notacin en parntesis: A(B(C,D),E,F(G,H,I))

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

{R} {I1, I2, , In} izquierdo de R } {D1, D2, , DnR de R


I1 I2 I3

Nodo raz Subrbol Subrbol derecho


D1 D2

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

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 hojas a nivel n-1 ocupan las posiciones ms a la izquierda del rbol.
A B C E F G

G H I

A B C D E

A B D E G H C F H

rbol completo (profundidad 4)

20

A B C D E F

rboles binarios completos


Un rbol binario completo que contiene 2n nodos a nivel n-1 es un rbol lleno. Es un rbol binario que tiene el mximo nmero de entradas para su altura. Esto sucede cuando el ltimo nivel sta lleno.
A B C

G H I

A B C D E

A B D E G H C F

rbol lleno (profundidad 3)


21

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

ESTRUCTURA DE UN RBOL BINARIO


izqdo datos dcho izqdo datos dcho

G H I

A B C D E

El algoritmo correspondiente a la estructura de un rbol es el siguiente:


Nodo subarbolIzquierdo Nodo> datos subarbolDerecho Nodo > <referencia a <TipoDato> < referencia24 a

A B D E G H C F

A B C D E F

ESTRUCTURA DE UN RBOL BINARIO


A B D E H C F

G H I

A B C D E

Estructura izqdo A dcho

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

Clase rbol binario


La naturaleza recursiva de un rbol binario determina la realizacin de las operaciones bsicas. La clase que representa a la estructura rbol tiene como variable de instancia la raz del rbol que es una referencia al nodo; sus ramas izquierda y derecha son, a su vez, rboles binarios.
28

G H I

A B C D E

A B D E G H C F

A B C D E F

Clase rbol binario


El mtodo nuevoArbol() crea un rbol cuya raz es un nodo con el campo dato el que se pasa como segundo argumento, la rama izquierda es el rbol que se pasa como primer argumento y la rama derecha es el rbol que se pasa como tercer argumento
29

G H I

A B C D E

A B D E G H C F

A B C D E F

Clase Arbol Binario


package arbolBinario; public class Arbol { private Nodo raiz; public Arbol(){ raiz = null; } public Arbol(Object elem){ raiz = new Nodo(elem); }
public void nuevoArbol(Arbol ramaI, Object dt, Arbol ramaD){ raiz = new Nodo(dt); if(ramaI != null) raiz.izqda = ramaI.raiz; if(ramaD != null) raiz.dcha = ramaD.raiz; } 30 // operaciones con rboles binarios

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

OPERACIONES EN RBOL BINARIO


Con un rbol binario se pueden realizar diversas operaciones, el hacer uso de una u otra operacin depender de la aplicacin que se le quiera dar a un rbol. Las operaciones son las siguientes:

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

Una expresin infija y su rbol de expresin


35

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

Enfoques generales para la secuencia de recorrido


En el recorrido en profundidad, el proceso profundidad exige un camino desde el nodo raz a travs de un nodo hijo, al descendiente ms 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. En el recorrido en anchura, el proceso se anchura realiza horizontal desde el nodo raz a todos sus hijos, a continuacin a los hijos de sus hijos y as sucesivamente hasta que todos los nodos han sido procesados. En otras palabras, en el recorrido en 39 anchura, cada nivel se procesa totalmente antes de que comience el

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

Recorrido en profundidad Preorden


Preorden (nodo-izquierdo-derecho) (NID)

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

Recorrido en profundidad Preorden


Dadas las caractersticas recursivas de los rboles, el algoritmo de recorrido tiene naturaleza recursiva. Primero, se procesa la raz, a continuacin el subrbol izquierdo y a continuacin el subrbol derecho. Para procesar el subrbol izquierdo, se hace una llamada recursiva al procedimiento preorden y luego se hace lo mismo con el subrbol derecho. El algoritmo recursivo correspondiente para un rbol T es:
si T no es vaco entonces inicio

G H I

A B C D E

A B D E G H C F

ver los datos en el nodo raz de T 42 Preorden (subrbol

A B C D E F

Recorrido en profundidad Preorden

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

Recorrido en profundidad Preorden


public class Arbol { public void preorden(){ if (raiz != null){ raiz.re_preorden(); } } }

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

Recorrido en profundidad Enorden

G H I

Enorden (izquierdo - nodo - derecho) (IND)

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

Recorrido en profundidad Enorden


El algoritmo recursivo correspondiente para un rbol T es:
si T no es vaco entonces inicio Enorden (subrbol izquierdo de la raz de T) ver los datos en el nodo raz de T Enorden (subrbol derecho de la raz de T) fin
A

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

Recorrido en profundidad Postorden


public class Arbol { public void enorden(){ if (raiz != null){ raiz.re_enorden(); } } }

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

Recorrido en profundidad Postorden


Postorden (izquierdo-derecho-nodo) (IDN)

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

Recorrido en profundidad Postorden


El algoritmo recursivo correspondiente para un rbol T es:
si T no es vaco entonces inicio Postorden (subrbol izquierdo de la raz de T) Postorden (subrbol derecho de la raz de T) ver los datos en el nodo raz de T Camino D ,E, B, F , G, C, A A fin
7
B C

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

Recorrido en profundidad Postorden


public class Arbol { public void postorden(){ if (raiz != null){ raiz.re_postorden(); } } }

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

Profundidad de un rbol binario


La profundidad de un rbol binario es una caracterstica que se necesita conocer con frecuencia durante el desarrollo de una aplicacin con rboles. El mtodo de la clase Arbol profundidad obtiene sta con el mtodo del mismo nombre de la clase Nodo que es llamado desde la raz del rbol. El caso ms sencillo de clculo de la profundidad es cuando el rbol est vaco, en cuyo caso la profundidad es 0 Si el rbol no est vaco, cada rama debe tener su propia profundidad, por lo que se necesita evaluar cada una por separado. Las variables profI, profD almacenarn las profundidades de las ramas izquierda y derecha respectivamente.
51

G H I

A B C D E

A B D E G H C F

A B C D E F

Profundidad de un rbol binario


El mtodo de clculo de la profundidad de las ramas utiliza llamadas recursivas al mtodo profundidad con referencias a las respectivas ramas o subrboles de la misma. El mtodo profundidad devuelve como resultado la mayor profundidad de las ramas ms 1 (correspondiente del nodo raz).

G H I

A B C D E

A B D E G H C F

52

A B C D E F

Profundidad de un rbol binario


public class Nodo { public int profundidad () { public class Arbol { int profI, profD; if (izda != null) public int profundidad() profI = { izda.profundidad(); if (raiz != null){ else return profI = 0; raiz.profundidad(); if (dcha != null) else profD = return 0; dcha.profundidad(); } else } profD = 0; if (profI > profD) } return profI + 1; else return profD + 1; 53 }

G H I

A B C D E

A B D E G H C F

A B C D E F

RBOL BINARIO DE BUSQUEDA


Los rboles vistos hasta ahora no tienen un orden definido; sin embargo, los rboles binarios ordenados tienen sentido. Estos rboles se denominan rboles binarios de bsqueda, debido a que se puede buscar en ellos un trmino, utilizando un algoritmo de bsqueda binaria. 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 54 los datos del subrbol derecho son

G H I

A B C D E

A B D E G H C F

A B C D E F

Creacin de un rbol binario de bsqueda


Construir un rbol binario de bsqueda para almacenar los datos 12, 8, 7, 16 y 14

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

Implementacin de un nodo de un rbol binario de bsqueda


Un rbol binario de bsqueda se puede utilizar cuando se necesita que la informacin se encuentre rpidamente. Un ejemplo de rbol binario que se estudia a continuacin es el que cada nodo contiene informacin relativa a una persona. Cada persona se identifica con su nombre y el nmero de matrcula en su universidad (dato entero). Declaracin de tpos
Nombre numMat Tipo de dato cadena (String) Tipo entero

G H I

A B C D E

A B D E G H C F

56

A B C D E F

Implementacin de un nodo de un rbol binario de bsqueda


Nombre numMat izqda dcha

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

OPERACIONES RBOL BINARIO DE BUSQUEDA


De lo expuesto se deduce que los rboles binarios de bsqueda tienen naturaleza recursiva y en consecuencia las operaciones sobre los rboles son recursivas, si bien siempre tenemos la opcin de realizarlas de forma iterativa. Las operaciones Con rboles binarios como profundidad y recorrido tambin son operaciones de rboles de bsqueda; adems, tienen operaciones especficas. Estas operaciones son:
Bsqueda de un nodo. Inercin de un nodo. Borrado de un nodo.

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