You are on page 1of 38

Arboles

Estructuras de Datos
FIEC03012

Estructuras de Datos
ESPOL 1
2016-1T
INTRODUCCION
Las listas enlazadas son estructuras lineales
Son flexibles pero son secuenciales, un elemento detrs de otro
Los rboles
Junto con los grafos son estructuras de datos no lineales
Superan las desventajas de las listas
Sus elementos se pueden recorrer de distintas formas, no
necesariamente uno detrs de otro
Son muy tiles para la bsqueda y recuperacin de informacin

Estructuras de Datos
ESPOL 2
2016-1T
CONCEPTO
A
Estructura que organiza sus elementos formando
jerarquas: PADRES E HIJOS
Los elementos de un rbol se llaman nodos B C
Si un nodo p tiene un enlace con un nodo m,
p es el padre y m es el hijo D E F
Los hijos de un mismo padre se llaman: hermanos
Todos los nodos tienen al menos un padre, menos la raz: A
Si no tienen hijos se llaman hoja: D, E, F y C
B
Un subrbol de un rbol
Es cualquier nodo del rbol junto con todos sus
descendientes D E F
Estructuras de Datos
ESPOL 3
2016-1T
TERMINOLOGIA
Camino: Secuencia de nodos conectados dentro de un arbol
Longitud del camino: es el numero de nodos menos 1 en un
camino
Altura del rbol: es el nivel mas alto del rbol
Un rbol con un solo nodo tiene altura 1
Nivel(profundidad) de un nodo: es el numero de nodos entre el
nodo y la raz.
Grado(aridad) de un nodo: es numero de hijos del nodo

Estructuras de Datos
ESPOL 4
2016-1T
TDA ARBOL : DEFINICION INFORMAL
Valores:
Conjunto de elementos, donde SOLO se conoce el nodo raz
Un nodo puede almacenar contenido y estar enlazado con
Sus rboles hijos (pueden ser dos o varios)
Operaciones: Dependen del tipo de rbol, pero en general tenemos
Vaciar o inicializar el Arbol
void Arbol_Vaciar (Arbol *A);
Eliminar un rbol
void Arbol_Eliminar(Arbol *A);
Saber si un rbol esta vaco
bool Arbol_EstaVacio(Arbol A);
Recorrer un rbol
void PreOrden(Arbol A)
void EnOrden(Arbol A)
void PostOrden(Arbol A)

Estructuras de Datos
ESPOL 5
2016-1T
TDA ARBOL: DEFINICION FORMAL

<arbol> ::= <<NULL>> | <nodo>


<nodo> ::= <contenido>{<arbol>}
<contenido> ::=
<<dato>>{<<dato>>}

Estructuras de Datos
ESPOL 6
2016-1T
ARBOLES BINARIOS A

B C
Tipo especial de rbol
Cada nodo no puede tener mas de dos hijos D

Un rbol puede ser un conjunto


RAIZ
Vaco, no tiene ningn nodo
A
O constar de tres partes:
Un nodo raz y B C
Dos subrboles binarios: izquierdo y derecho D E F G
La definicin de un rbol binario es recursiva
H I J
La definicin global depende de si misma
Sub. Izq. Sub. Der.

Estructuras de Datos
ESPOL 7
2016-1T
DEFINICIONES RECURSIVAS SUB. DER.
La definicin del rbol es recursiva A
Nivel 1

Se basa en si misma
B C
La terminologa de los rboles
D
Tambin puede ser definida en forma recursiva
Ejemplo: NIVEL de un rbol E

Identificar el caso recursivo y el caso mas bsico


SUB. IZQ.
SUB.
SUB.IZQ.
IZQ.
SUB. IZQ.
NivelSUB.
= 1 DER..
+
nivel 1 S. izq. A S. der. Nivel = =1 3+
Nivel
Max(0,Sub.Izq)
Nivel =1+
A Nivel 1 Nivel 1 Max(0,2)
Nivel =1
Max(0,Sub.Izq.)
Max(0,1)
B C
NIVEL
NIVEL
: 1 +NIVEL
:MAX(S.IZQ,
1 + MAX(3,
:4 S.DER)
1)
Nivel Del Arbol: 2
Caso Bsico
Un rbol con un solo Caso Recursivo
nodo tiene nivel 1 Si tiene mas de un nodo, el nivel
es:
Estructuras de Datos
1 + MAX(Nivel(SubIzq),
ESPOL Nivel(SubDer)) 8
2016-1T
ARBOLES BINARIOS LLENOS
Un rbol de altura h, esta lleno si
Todas sus hojas esta en el nivel h
Los nodos de altura menor a h tienen siempre 2 hijos
T tiene 2h nodos a nivel h
Recursiva
Si T esta vaco,
Entonces T es un rbol binario lleno de altura 0
Si no esta vaco, y tiene h>0
Esta lleno si los subrboles de la raz, son ambos rboles
binarios llenos de altura h-1
Estructuras de Datos
ESPOL 9
2016-1T
ARBOLES BINARIOS COMPLETOS
Un arbol de altura h esta completo si
Todos los nodos hasta el nivel h-1 forman
un arbol lleno y
todos los nodos hoja a nivel h ocupan las
posiciones ms a la izquierda del rbol

Si un arbol esta lleno, tambien esta


completo

Estructuras de Datos
ESPOL 10
2016-1T
OTROS

Un rbol equilibrado es cuando


La diferencia de altura entre los subrboles de cualquier
nodo es mximo 1
Un rbol binario equilibrado totalmente
Los subrboles izquierdo y derecho de cada nodo tienen las
misma altura: es un rbol lleno
Un rbol completo es equilibrado
Un rbol lleno es totalmente equilibrado

Estructuras de Datos
ESPOL 11
2016-1T
AB y NODOAB: DEFINICION FORMAL

<ab>::= nulo | < nodo >


<nodoab>::=<contenido>+<izq>+<der>
<izq>::=<ab>
<der>::=<ab>
<contenido>::<<dato>>|{<<dato>>}

Estructuras de Datos
ESPOL 12
2016-1T
AB Y NODOAB: DECLARACION
Interface ArbolBinario<T>{

}
Un rbol binario: conjunto de nodos
Solo se necesita conocer el nodo raz class NodoAB<T> implements ArbolBinario<T>{
T contenido;
NodoAB izq, der;
Cada nodo NodoAB padre;
}
Tiene Contenido y
Dos enlaces: rbol hijo izquierdo, rbol hijo derecho
Un nodo hoja, es aquel cuyos dos enlaces apunta a null
Un nodo en un rbol tiene mas punteros a null que un nodo de una lista
De un rbol solo se necesita conocer su raz

Estructuras de Datos
ESPOL 13
2016-1T
NODOAB: OPERACIONES
Operaciones Bsicas
Crear un nuevo nodo hoja y eliminar hoja existente
NodoAB CrearHoja(<T> contenido);
void eliminar (NodoAB nodo);
Saber si el nodo es o no hoja
Bool esHoja(NodoAB nodo);

Estructuras de Datos
ESPOL 14
2016-1T
NODOAB: MAS OPERACIONES
Consultas de los campos de un nodo
<T> ConsultaContenido(NodoAB nodo);
NodoAB hijoIzq (NodoAB nodo);
NodoAB hijoDer(NodoAB nodo);

Cambiar los campos de un nodo


void setContenido (NodoAB nodo , <T> contenido);
void setIzq(NodoAB nodo, NodoAB enlace);
void setDer(NodoAB nodo, NodoAB enlace);

Estructuras de Datos
ESPOL 15
2016-1T
AB: OPERACIONES
Crear y Eliminar
AB_Vaciar(AB A);
AB_Eliminar(AB A);
Estado del Arbol
bool AB_EstaVacio(AB A);
Aadir y remover nodos
void AB_InsertarNodo(AB A, NodoAB nuevo)
NodoAB AB_SacarNodoxContenido(AB A, <T> contenido);
NodoAB AB_SacarNodoxPos(AB A, NodoAB pos);
Busqueda por contenido
NodoArbol AB_Buscar(AB A, <T> contenido);
Recorridos
void AB_PreOrden(AB A);
void AB_PosOrden(AB A);
void AB_EnOrden(AB A);

Estructuras de Datos
ESPOL 16
2016-1T
AB: INSTANCIANDO Y CREANDO
Un Arbol Vaco, es aquel cuyo nodo raz apunta a NULL
void AB_Vaciar(AB A){
A = NULL;
}

Para crear una variable tipo Arbol, y empezarla a usar:


Instanciarlo (crear variable)
AB A;
Vaciar el rbol
AB_Vaciar(&A);

A
Para aadirle una hoja al rbol, crear hoja: 1
A = NodoAB_CrearHoja( 1);

Estructuras de Datos
ESPOL 17
2016-1T
RECORRIDOS DE UN A.B.
Recorrer es
Visitar todos los elementos de una estructura
Como recorrer un rbol
Hay tantos caminos, cual escoger?
Existe tres recorridos tpicos
Nombrados de acuerdo a la posicin de la raz
Preorden: raz - subarbol izq. - subarbol der.
Enorden : subarbol izq. - raz - subarbol der.
Postorden : subarbol izq. - subarbol der. -raz

Estructuras de Datos
ESPOL 18
2016-1T
1. Visitar raiz
2. Preorden al Subarbol Izq.
3. Preorden al Subarbol Der.
EJEMPLO PREORDEN
G
1
D K
2 8
B E H
J M
3 6 9 12
A C F JI L
4 5 7 10 13

H
I
11

G-D
G-D-B-A-C-E
G-D-B-A-C
G-D-B-A
G-D-B
G-D-B-A-C-E-F
G-D-B-A-C-E-F-K
G-D-B-A-C-E-F-K-H
G-D-B-A-C-E-F-K-H-J
G-D-B-A-C-E-F-K-H-J-I
G-D-B-A-C-E-F-K-H-J-I-M
G-D-B-A-C-E-F-K-H-J-I-M-L
Estructuras de Datos
ESPOL 19
2016-1T
RECORRIDOS: IMPLEMENTACION
Las operaciones de recorrido son recursivas
Ejemplo: EnOrden
Recorrer EnOrden al subarbol izquierdo
Visitar nodo raiz
Recorrer EnOrden al subarbol derecho
En todo algoritmo recursivo debemos buscar dos casos
Bsico, para terminar la recursividad
Recursivo, donde la funcin se llama a si misma
Caso Recursivo
Caso Bsico Si !AB_EstaVacio(raiz)
Si AB_EstaVacio(raiz) AB_EnOrden(raiz->izq);
Terminar de recorrer Mostrar raiz
AB_EnOrden(raiz->der);

Estructuras de Datos
ESPOL 20
2016-1T
OPERACION ENORDEN
void enOrden(NodoAB arbol){
if(estaVacio(arbol))
return;

enOrden(arbol.izq);
System.out.println(arbol. contenido);
enOrden(arbol.der);
}

Arbol
ArbolVacio!,
Vacio!,Terminar
Terminar 4
B C

2 6
D E F G

Arbol Vacio!, Terminar 1 3 5 7

Estructuras de Datos
ESPOL 21
2016-1T
EJEMPLO AB
G
7
D K
4 11
B E H
J M
2 5 10 13
A C F JI L
1 3 6 9 12

H
I
8

Estructuras de Datos
ESPOL 22
2016-1T
APLICACIN: EVALUACION DE EXPRESIONES

Ya sabemos lo de las expresiones:


InFija, operador en medio
PreFija, operador antes de dos operandos
PosFija, operador luego de dos operandos
Para evaluar una expresion dada, podriamos
Pasarla a posfija y usar solo pilas
Pasarla a posfija y usar pilas y un arbol de expresion

Estructuras de Datos
ESPOL 23
2016-1T
ARBOL DE EXPRESION
Arboles que representan expresiones en
memoria
Todos los operadores tienen dos operandos
La raiz puede contener el operador
Hijo izq: operando 1, Hijo derecho: operando 2
Ejemplo: (a+b) (a+b)*c
+ *

a b + c
Estructuras de Datos
ESPOL a b 24
2016-1T
EVALUAR UNA EXPRESION ARTIMETICA EN
INFIJA

La expresion se transforma a la expresion posfija


Esto, ya sabemos como hacer
Crear un arbol de expresion
Para esto se va a usar una pila y un arbol de caracteres
Usando el arbol, evaluar la expresion

Estructuras de Datos
ESPOL 25
2016-1T
CREAR UN ARBOL DE EXPRESION
Los operandos seran siempre nodos hoja del arbol
Al revisar un operando, creo una nueva hoja y la recuerdo
Los operadores seran nodos padre
Al revisar un operador, recuerdo las dos ultimas hojas creadas y uno
todo
pop() hijo derecho pop() hijo izquierdo
Recuerdo el resultado

A*B-C*D+H AB*CD*-H+ +

- H

D * *
-
C * A B C D
H *
B *
* C D
Estructuras de Datos
A ESPOLA B C D 26
A B
2016-1T
EVALUACION DEL ARBOL DE EXPRESION
Lo ideal es recuperar los dos operandos, el operador, y ejecutar la opcion

Para evaluar el arbol:


+ Si el arbol tiene un solo nodo y este almacena un
operando
- H
El resultado de la evaluacion es el valor de ese
* * operando

A B C D Si no
1. Res1 = Evaluo subarbol izquierdo
2. Res2 = Evaluo subarbol derecho
A*
(Ay*BB) -y (C*D)
CyD+
(C*D) y HH 3. Recupero la info de la raiz y efectuo la
operacin alli indicada, entre Res1 y Res2

Estructuras de Datos
ESPOL 27
2016-1T
ARBOL BINARIO DE BUSQUEDA
<>
55
Los elementos en un arbol
Hasta ahora no han guardado un orden 30 75
No sirven para buscar elementos
4 41 85
Los arboles de busqueda
Permiten ejecutar en ellos busqueda binaria <>
Dado un nodo: 6
Todos los nodos del sub. Izq. Tienen una clave menor
que la clave de la raiz 4 9
Todos los nodos del sub. Der. Tienen una clave mayor
que la clave de la raiz 5
Estructuras de Datos
ESPOL 28
2016-1T
TDA ABB: DEFINICION
<abb>::= NULL | <abb_nodo>
<abb_nodo>::=<clave>+<contenido>+<izq>+<der>
<izq>::=<abb>
<der>::=<abb>
Valores: <clave>::<<dato>>|{<<dato>>}
Conjunto de elementos<contenido>::<<dato>>|{<<dato>>}
Dado un nodo p,
Los nodos del rbol izquierdo almacenan valores menores al de p
Los nodos del rbol derecho almacenan valores mayores al de p
Operaciones
Son las mismas operaciones que para un AB
Pero en este caso ya tenemos reglas suficientes que nos indican como:
Insertar
Sacar y public class ABB_Nodo{
Buscar Object clave, contenido;
ABB_Nodo izq, der;
}
Estructuras de Datos
ESPOL 29
2016-1T
CREAR CON CLAVE
Como el nodo ahora tiene un campo clave
Cambian un poco las operaciones del nodo
Ejemplo
/* constructor */
public NodeAB(Object clave, Object contenido){
this.clave = clave;
this.contenido = contenido;
this.izq = NULL;
this.der= NULL;
}

Estructuras de Datos
ESPOL 30
2016-1T
CREACION DE UN ABB
Un arbol de busqueda debe mantener
A la derecha mayor a raiz
A la izq. Menor a raiz
Ejemplo:
Construya arbol con los siguientes elementos:
8, 3, 1, 20, 10, 5, 4

3 20

1 5 10

4
Estructuras de Datos
ESPOL 31
2016-1T
EJERCICIO EN CLASE
Construya el arbol para almacenar:
14, 8, 7, 1,12,16, 4,11

Estructuras de Datos
ESPOL 32
2016-1T
BUSQUEDA DE UN NODO
Dada una clave, devolver el nodo que la contiene
Se comienza en la raiz
Si el arbol esta vacio
Buscar(raiz,25)
Buscar(raiz,5)
No se encontro
Si clave buscada es igual a la clave del nodo evaluado
ENCONTRADO!!!
Si no 8
Si la clave buscada es mayor a la del nodo evaluado
Buscar en el subarbol derecho 3 20
Si no
Buscar en el subarbol izquierdo 1 5 10

4 No existe

Estructuras de Datos
ESPOL 33
2016-1T
IMPLEMENTACION DE LA BUSQUEDA
NodoABB buscar(NodoABB arbol, T clave){
if(estaVacio(arbol)) return null;
if(clave.compareTo(arbol.clave) == 0)
return arbol;
if(clave.compareTo(arbol.clave) > 0)
return buscar(arbol.der, clave);
else
return buscar(arbol.izq, clave);
}

Estructuras de Datos
ESPOL 34
2016-1T
INSERCION DE UN NODO
Muy parecido a la busqueda Insertar(raiz,15)
15>8der
Debo insertar en la posicion correcta
15<20izq
El arbol debe mantener sus propiedades 8
15>10
Pasos: 3 der 20

Crear una nueva hoja 1 5 10 Insertar


aqui
Buscar en el arbol donde ponerla 4
15
Enlazar el nuevo nodo al arbol

Estructuras de Datos
ESPOL 35
2016-1T
IMPLEMENTACION DE LA INSERCION
NodoABB insertar(NodoABB A, Object nuevo){
if(A == null) {
return new NodoABB(nuevo);
}

if (nuevo.compareTo(A.getContenido()) == 0) {
return A;
}
else if (nuevo.compareTo(A.getContenido()) > 0) {
A.setDerecho(insertar(A.getDerecho(), nuevo));
}
else {
A.setIzquierdo(insertar(A.getIzquierdo(), nuevo));
}

return A;
}

Estructuras de Datos
ESPOL 36
2016-1T
ELIMINACION DE UN NODO
Es mas compleja que la insercion Eliminar(raiz,34)

Al sacar un nodo del arbol 34


28
El arbol debe mantener sus propiedades
El arbol debe reajustarse 18 90
Pasos: 6 25 100
Buscar el nodo p que se va a eliminar
Si el nodo a eliminar tiene menos de dos hijos 20 28
Subir el nodo hijo a la pos. del nodo eliminado
Si no nmayor
Ubicar el nodo q con la mayor de las claves menores o
con la menor de las claves mayores
Reemplazar contenido de p con el del nodo q
Eliminar el nodo q que se encontro el el primer paso

Estructuras de Datos
ESPOL 37
2016-1T
ELIMINACION DE UN NODO
Eliminar(raiz,5)

Estructuras de Datos
ESPOL 38
2016-1T

You might also like