Está en la página 1de 28

Árboles

Carlos Delgado Kloos


Ingeniería Telemática
Univ. Carlos III de Madrid

cdk@it.uc3m.es Java: Árboles / 1

Cita

a "The structure of concepts


p is formallyy called a
hierarchy and since ancient times has been a
basic structure for all western knowledge.
Kingdoms, empires, churches, armies have all
been structured into hierarchies. Tables of
contents of reference material are so structured,
mechanical assemblies,, computer
p software,, all
scientific and technical knowledge is so
structured..."
-- Robert M. Pirsig: Zen and
the Art of Motorcycle Maintenance
cdk@it.uc3m.es Java: Árboles / 2

1
Definición no recursiva

aUn árbol consiste en un conjunto de


nodos y un conjunto de aristas, de
forma que:
¾Se distingue un nodo llamado raíz
¾A cada nodo h, excepto la raíz, le llega una
arista de otro nodo p
(p padre de h, h uno de los hijos de p)
¾Para cada nodo hay un camino (secuencia
de aristas) único desde la raíz.

cdk@it.uc3m.es Java: Árboles / 3

Ejemplo

Raíz ((sin ppadre))

El padre de h
p hermano
Un hijo de p de h

Hojas
Hojas Hojas
Hojas
(sin (sin
hijos) (sin(sin
hijos)
hijos) hijos)
cdk@it.uc3m.es Java: Árboles / 4

2
Ejemplo

Raíz ((sin ppadre))

El padre de h
p hermano
Un hijo de p de h

Hojas
Hojas Hojas
(sin (sin
hijos) (sin(sin
hijos)
hijos) hijos)
cdk@it.uc3m.es Java: Árboles / 5

Definición recursiva (1)

aUn árbol es
¾Un nodo
¾o un nodo y subárboles conectados con el
nodo por medio de una arista a su raíz

No incluye
al árbol vacío

cdk@it.uc3m.es Java: Árboles / 6

3
Definición recursiva (2)

aUn árbol es
¾vacío
¾o un nodo y cero o más subárboles no vacíos
conectados con el nodo por medio de una
arista a su raíz

cdk@it.uc3m.es Java: Árboles / 7

Ejemplos

aUn sistema de ficheros


aLa estructura de un documento (capítulos,
apartados, subapartados, ...)
aUn árbol de decisión
aUn árbol genealógico

cdk@it.uc3m.es Java: Árboles / 8

4
(()(()())())

()

() () ()

() ()

cdk@it.uc3m.es Java: Árboles / 9

Terminología

aUn nodo es externo,, si no tiene hijos


j (es
( hoja)
j )
aUn nodo es interno, si tiene uno o más hijos
aUn nodo es ascendiente de otro, si es padre
de él o ascendiente de su padre.
aUn nodo es descendiente de otro, si este es
ascendiente del primero
aLos descendientes de un nodo determinan un
subárbol en el que ese nodo hace el papel de
raíz

cdk@it.uc3m.es Java: Árboles / 10

5
Terminología

aUn árbol es ordenado, si para cada nodo


existe un orden lineal para todos sus
hijos.
aUn árbol binario es un árbol ordenado,
en el que cada nodo tiene 0, 1 o 2 hijos
( l hijo
(el h izquierdo
d y ell derecho).
d h )

cdk@it.uc3m.es Java: Árboles / 11

Terminología

aUn camino de un nodo a otro, es una


secuencia de aristas consecutivas que
llevan del primero al segundo. Su longitud
es el número de aristas que tiene.
aLa profundidad de un nodo es la
longitud del camino de la raíz a ese nodo.
aLa altura de un árbol es la profundidad
del nodo más profundo.

cdk@it.uc3m.es Java: Árboles / 12

6
Algoritmos básicos

aTamaño (número de nodos)


aProfundidad de un nodo
aAltura
aRecorridos
¾Euler
¾Pre-, in- y post-orden
aSuponemos árboles binarios para
simplificar
cdk@it.uc3m.es Java: Árboles / 13

Clase Nodo binario...

class NodoB {
Object d;
NodoB izq;
NodoB der;
NodoB() {this(null);}
NodoB(Object o) {this(o,null,null);}
NodoB(Object o, NodoB i, NodoB d)
{d=o; izq=i; der=d;}

cdk@it.uc3m.es Java: Árboles / 14

7
...Clase Nodo binario

static int size (


(NodoB a){...;}
){ }
static int height (NodoB a){...;}

void preorder (NodoB a){...;}


void inorder (NodoB a){...;}
void postorder (NodoB a){...;}
}

cdk@it.uc3m.es Java: Árboles / 15

Clase Árbol binario...

class ArbolB {
protected NodoB raiz;
ArbolB() {raiz=null;}
ArbolB(Object o){raiz=new NodoB(o);}
public int size()
{return NodoB.size(raiz);}
public int height()
{return NodoB.height(raiz);}

cdk@it.uc3m.es Java: Árboles / 16

8
...Clase Árbol binario

p
public void p
preorder ()
{if (raiz!=null) raiz.preorder();}
public void inorder ()
{if (raiz!=null) raiz.inorder();}
public void postorder ()
{if (raiz!=null) raiz.postorder();}
}

cdk@it.uc3m.es Java: Árboles / 17

Tamaño

static int size ((NodoB a){


){
if (a==null)
return 0;
else
return 1+size(a.izq)+size(a.der);
}

cdk@it.uc3m.es Java: Árboles / 18

9
Altura

static int height


g (NodoB a){
( ){
if (a==null)
return (-1);
else
return 1+Math.max(height(a.izq),
height(a.der));
}

cdk@it.uc3m.es Java: Árboles / 19

Recorrido de Euler

cdk@it.uc3m.es Java: Árboles / 20

10
Recorrido preorden

2 3

4 6

5 7
cdk@it.uc3m.es Java: Árboles / 21

Recorrido postorden

1 6

3 5

2 4
cdk@it.uc3m.es Java: Árboles / 22

11
Recorrido inorden
(simétrico)

1 5

3 7

4 6
cdk@it.uc3m.es Java: Árboles / 23

(A+B)*(C–D)

+ –

A B C D

cdk@it.uc3m.es Java: Árboles / 24

12
Actividad

aVisualización de expresiones como árboles


http://www cs jhu edu/~goodrich
http://www.cs.jhu.edu/~goodrich
/dsa/05trees/Demo1/

cdk@it.uc3m.es Java: Árboles / 25

Ejemplo

Infijo Prefijo Posfijo

A+B +AB AB+

A+B C
A+B–C –+ABC
+ABC AB+C
AB+C–

(A+B)*(C–D) *+AB–CD AB+CD–*

cdk@it.uc3m.es Java: Árboles / 26

13
Notación postfijo

aCalculadoras HP
aPila para almacenar operandos
aEj.: 3 5 + 6 2 – *

2
54
6
32
38
cdk@it.uc3m.es Java: Árboles / 27

preorden

void preorder (){


System.out.println(d);
if (izq != null)
izq.preorder();
if (der != null)
der.preorder();
}
cdk@it.uc3m.es Java: Árboles / 28

14
postorden

void postorder (){


if (izq != null)
izq.postorder();
if (der != null)
der postorder();
der.postorder();
System.out.println(d);
}
cdk@it.uc3m.es Java: Árboles / 29

inorden

void inorder (){


if (izq != null)
izq.inorder();
System.out.println(d);
if (der != null)
der.inorder();
}
cdk@it.uc3m.es Java: Árboles / 30

15
Propiedades de
árboles binarios

aSea
¾ E=Número de nodos externos
¾ I=Número de nodos internos
¾ N=Tamaño=E+I
¾ H=Altura
aSe cumple
p
¾ E=I+1
¾ H+1≤E≤2H H≤I≤2H-1 2*H+1≤N≤2H+1-1
¾ log2(N+1)-1≤H≤(N-1)/2

cdk@it.uc3m.es Java: Árboles / 31

Implementaciones

aBasada en secuencia
aBasada en estructura enlazada

cdk@it.uc3m.es Java: Árboles / 32

16
Implementación
basada en secuencia

1 p(raiz)=1
p(x.izq)=2*p(x)
p(x.der)=2*p(x)+1
2 3

4 5 6 7

1 2 3 4 5 6 7

cdk@it.uc3m.es Java: Árboles / 33

Implementación
basada en enlaces

2 3

4 5 6 7

cdk@it.uc3m.es Java: Árboles / 34

17
Árboles binarios
de búsqueda

aUn árbol binario de búsqueda es un


árbol binario en el que para cada nodo n,
¾ todas las claves de los nodos del
subárbol izquierdo son
menores que la clave de n (o iguales)
¾ y todas las del subárbol derecho
mayores (o iguales).

cdk@it.uc3m.es Java: Árboles / 35

Ejemplo

4
1

2 8
2

1 3 6 9
3
3 5 7

cdk@it.uc3m.es Java: Árboles / 36

18
Ejemplo

8
1
6 9
2
4 7
3
2 5
4
1 3
cdk@it.uc3m.es Java: Árboles / 37

Operaciones

aBúsqueda
aInserción
aEliminación

cdk@it.uc3m.es Java: Árboles / 38

19
Búsqueda
Buscamos el “3”:
• 3<4: Subárbol
á izquierdo
• 3>2: Subárbol derecho 4
• 3=3: Elemento encontrado

2 8

1 3 6 9

http://www.cosc.canterbury.ac.nz/
mukundan/dsal/BST.html
5 7

cdk@it.uc3m.es Java: Árboles / 39

Inserción

7 • Nos desplazamos dependiendo del


resultado
lt d dde lla comparación,

cuando lleguemos a una hoja
insertamos.
2 9 – Si la clave del elemento a insertar
coincide con la del nodo raíz el
elemento a insertar sustituye al
que había
1 5 – Si es menor buscamos en el
subárbol izquierdo
– Si es mayor buscamos en el
3 6 subárbol derecho
– Si llegamos a un nodo degenerado
– Si es menor insertamos a la
izquierda
Ejemplo: insertar el 6 – Si es mayor insertamos a la
derecha
cdk@it.uc3m.es Java: Árboles / 40

20
Eliminación
7 7
• Es complicado ya que los nodos
2 9 2 9 internos mantienen al árbol
conectado. Para eliminar:
1 5 1 – Si se trata de una hoja se
elimina directamente
– Si tiene un único hijo se
3 Elimino el 5 (1 hijo) 3 elimina el nodo haciendo que
su nodo padre pase a
referenciar a su nodo hijo
7 7
– Si tiene dos hijos :
– Se sustituye el nodo por el
2 9 3 9 menor elemento de su
subárbol derecho
– Se elimina el nodo
1 5 1 5 correspondiente a dicho
menor elemento
Elimino el 2 (2 hijos)
3
cdk@it.uc3m.es Java: Árboles / 41

Actividad

aVer animación de árboles binarios de


búsqueda
http://www.ibr.cs.
tu-bs.de/courses/
ss98/audii/applets/
BST/BST-Example.html

cdk@it.uc3m.es Java: Árboles / 42

21
Montículos (Heaps)

aUn montículo es un árbol binario en el


que para cada nodo n (excepto para el
raíz), su clave es mayor o igual que la de
su padre.
aSirve para la implementación de colas con
prioridad
d d

cdk@it.uc3m.es Java: Árboles / 43

Ejemplo

2 4

3 5 6 9

8 7

cdk@it.uc3m.es Java: Árboles / 44

22
Montículo completo

2 4

3 5 6 9

8 7

cdk@it.uc3m.es Java: Árboles / 45

Insertar

5 6

15 9 7 20

16 25 14 12 11 8
cdk@it.uc3m.es Java: Árboles / 46

23
Insertar

5 6

15 9 7 20

16 25 14 12 11 8 2
cdk@it.uc3m.es Java: Árboles / 47

Insertar

5 6

15 9 7 2

16 25 14 12 11 8 20
cdk@it.uc3m.es Java: Árboles / 48

24
Insertar

5 2

15 9 7 6

16 25 14 12 11 8 20
cdk@it.uc3m.es Java: Árboles / 49

Insertar

5 4

15 9 7 6

16 25 14 12 11 8 20
cdk@it.uc3m.es Java: Árboles / 50

25
Eliminar

5 6

15 9 7 20

16 25 14 12 11 8
cdk@it.uc3m.es Java: Árboles / 51

Eliminar

5 6

15 9 7 20

16 25 14 12 11
cdk@it.uc3m.es Java: Árboles / 52

26
Eliminar

8 6

15 9 7 20

16 25 14 12 11
cdk@it.uc3m.es Java: Árboles / 53

Actividad

aProbar el formulario de
http://www.csse.monash.edu.au/~lloyd
/tildeAlgDS/Priority-Q/

cdk@it.uc3m.es Java: Árboles / 54

27
Actividad

aProbar el applet de
http://www.cosc.canterbury.ac.nz/
mukundan/dsal/MinHeapAppl.html

cdk@it.uc3m.es Java: Árboles / 55

28

También podría gustarte