You are on page 1of 83

rboles

Laboratorio de Programacin II

Definicin
Un rbol est compuesto por un conjunto de
cero o ms nodos y un conjunto de enlaces (o
arcos) que conectan pares de nodos.
Cada nodo contiene:
Un valor (algn tipo de elemento)
Una referencia o puntero al hijo izquierdo (puede
ser null), y
Una referencia o puntero al hijo derecho (puede
ser null)

En todo rbol:
Existe un nodo distinguido como la raz, que
no tiene antecesores.
Todo nodo c est conectado por un enlace a
exactamente un solo nodo p, su padre.
Una hoja es un nodo terminal (no tiene hijos).
Existe un solo camino desde la raz a cada
hoja.

rbol como estructura de datos


Es una estructura referencial, como la lista.
Abandona el concepto de contigidad que se
conservaba desde los arrays.

rbol como estructura de datos


La cantidad de saltos que se cuentan durante
el recorrido es la longitud del camino.
La altura de un nodo es la longitud existente
entre el nodo y su hoja que se encuentra en lo
ms profundo de su camino.

A no tiene padre, es
el nodo raz

La longitud de A hasta A es 0
La longitud de A hasta K es 3

Operaciones

Agregar
Buscar
Remover
Recorrer
Ir a raz
Primer hijo
Prximo hijo

Ms definiciones
Dos nodos son hermanos cuando comparten
el mismo padre.
Si existe un camino que va de U a V, entonces
U es un ancestro de V y V un descendiente de
U.

Ms definiciones
El tamao de un nodo es el nmero de sus
descendientes.
El tamao de un rbol es el tamao de su raz.

Vista recursiva
A

....
T1

T2

T3

Tk

rboles Binarios
Por definicin, ningn nodo puede tener ms
de dos hijos.
A los hijos se los nombran izquierdo y
derecho.

rboles Binarios
La definicin recursiva:
Un rbol puede estar vaco, o bien compuesto por
una raz, y un subrbol izquierdo y subrbol
derecho.

El acceso y la insercin de nodos en este tipo


de rboles tiene complejidad logartmica.

Partes de un rbol binario


Un rbol binario puede ser vaco (sin nodos).
Si no es vaco, un rbol binario tiene un nodo raz
Todo nodo en un rbol binario es alcanzable desde el
nodo raz por un nico camino.

Un nodo con ningn hijo izquierdo ni derecho es


una hoja.
En algunos rboles binarios, slo las hojas contienen
valores.

Grafo de un rbol binario


A

Tamao del rbol binario


El tamao de un rbol
binario es el nmero de
nodos que contiene

Este rbol tiene tamao


12

Profundidad
La profundidad de un
nodo es la distancia
desde la raz
a est a profundidad
cero
E est a profundidad 2

Balance
Un rbol binario est balanceado si el
anteltimo nivel del rbol est lleno (contiene
2n nodos).
En la mayora de las aplicaciones, lo ms til
es contar con un rbol razonablemente
balanceado.

Balance
balanceado

desbalanceado

EJEMPLO: BUSQUEDA BINARIA

Bsqueda binaria sobre vector


Buscar en la ubicacin (lo + hi)/2

Bsqueda binaria sobre rbol binario

Propiedades de los rboles binarios


Existe un nico camino entre dos nodos
Un rbol con N nodos tiene N-1 arcos
El peso de un rbol binario completo con N
nodos es log2N

Recorridos en un rbol
Definimos un rbol binario en forma recursiva:
una raz,
un subrbol izquierdo y
un subrbol derecho.

Recorrer (o caminar) un rbol binario es visitar


cada nodo exactamente una vez.
Los recorridos en los rboles son
naturalmente recursivos.

Formas de recorrer un rbol


PreOrden
Se procesa el nodo y luego sus hijos de izquierda a
derecha.

PostOrden
Se procesan los nodos de izquierda a derecha y
luego el padre.

InOrden
Se procesa el nodo de la izquierda, luego el padre,
y finalmente el nodo derecho.

Recorridos en un rbol
Como un rbol binario tiene tres partes, hay
seis formas posibles de recorrerlo:
raz, izquierdo, derecho
izquierdo, raz, derecho
izquierdo, derecho, raz
raz, derecho, izquierdo
derecho, raz, izquierdo
derecho, izquierdo, raz

InOrden:
F, B, G, A, I, E, K, J.

PreOrden:
A, B, F, G, E,I, J, K.
PostOrden:
F, G, B, I, K, J, E, A.

Recorrido preorden
primero la raz
recorrido preorden para un rbol binario:
public void preorderPrint(BinaryTree bt) {
if (bt == null) return;
print (bt.value);
preorderPrint (bt.leftChild);
preorderPrint (bt.rightChild);
}

Recorrido Inorden
la raz se visita en el medio.
recorrido en inorden para un rbol binario:
public void inorderPrint(BinaryTree bt) {
if (bt == null) return;
inorderPrint (bt.leftChild);
print (bt.value);
inorderPrint (bt.rightChild);
}

Recorrido postorden
la raz se visita al final
Aqu se muestra un recorrido en postorden
para un rbol binario
public void postorderPrint(BinaryTree bt) {
if (bt == null) return;
postorderPrint(bt.leftChild);
postorderPrint(bt.rightChild);
System.out.println(bt.value);
}

Recorridos usando banderas


El orden en el que se visitan los nodos
durante el recorrido puede determinarse
imaginando que hay una bandera en cada
nodo, como por ejemplo:

preorden

inorden

postorden

Recorridos usando banderas


Para recorrer el rbol, juntar las banderas:

A
B

ABDECFG

C
E

DBEAFCG

DEBFGCA

ABB

rbol Binario de Bsqueda (ABB)


Tenemos un conjunto de elementos
ordenados por alguna clave.

rbol Binario de Bsqueda (ABB)


En un ABB, todos los nodos almacenados en el
subrbol izquierdo de un nodo cuyo valor
clave es K, tienen claves menores que K,
mientras que los nodos ubicados en el
subrbol derecho tienen claves mayores que
K.

ABB
NO ES UN ABB

S ES UN ABB
C

ABB
Los algoritmos de bsqueda en los rboles
binarios tienen una complejidad O(log N).
Idea del algoritmo:
Los datos se buscan usando una clave.
En un rbol binario se satisface la propiedad de
bsqueda ordenada. Esto es, para un nodo X, los
valores de las claves en el subrbol izquierdo son
menores al valor de la clave de X, y los valores en
el subrbol derecho son mayores.

Las Funciones
ms simples:
Agregar
Buscar
BuscarMax
BuscarMin

ms compleja:
Remover
Si el nodo es hoja, el proceso es sencillo.
Si el nodo tiene 2 hijos, la estrategia es reemplazar el
nodo a remover con el menor elemento del subrbol
izquierdo.

rboles de expresin
El rbol correspondiente a la expresin
(A+B)*(C-D)
*

RBOLES B

rbol B
Los nodos tienen ms de 2 hijos,
Cada nodo interno tiene entre k y 2k hijos y
entre (k-1) y (2k-1) claves,
Una hoja tiene entre (k-1) y (2k-1) claves,
La raz tiene al menos dos hijos,
Todas las hojas estn a la misma distancia de
la raz.

rbol B
Tiene una raz T.raz, con las siguientes propiedades:
Todo nodo x tiene atributos:
x.n, el nmero de claves almacenadas en el nodo
x,
Las x.n claves, x.key1; x.key2 ; ; x.keyx.n, se
almacena en orden no decreciente, de tal forma
que x.key1 x.key2 x.keyx.n,
x.hoja, es un valor boolean que es TRUE si x es
una hoja y FALSE si no.
Cada nodo interno x tambin contiene x.n+1
punteros x.c1; x.c2; ; x.cxn+1 a sus hijos.

Los nodos hoja no tienen hijos, sus atributos estn


indefinidos.
Las claves estn separadas por rangos en cada subrbol
k1 x.k1 k2 x.k2 x.kx.n kx.N+1
Todas las hojas tienen la misma profundidad, que es la
altura del rbol.

Los nodos tienen cotas superior e inferior. El entero t-2


se llama grado mnimo de un rbol B:
Todo nodo que no es raz debe tener al menos t-1
claves.
Todo nodo interno que no es raz tiene al menos t-1
hijos.
Si el rbol no est vaco, la raz debe tener al menos 1
clave.
Todo nodo debe contener a lo sumo 2t-1 claves.
Decimos que el nodo est LLENO si contiene
exactamente 2t-1 claves.

El peso de un rbol B
El nmero de accesos a disco requeridos para la
mayora de las operaciones en un rbol B es
proporcional a la altura del rbol B.
Teorema del peor caso: Si n 1, entonces para
cualquier rbol B de n claves y altura h y grado
mnimo t 2,
h

+1
log
2

Peso

La raz tiene al menos 2 hijos


El nivel 2 tiene al menos 2k nodos
El nivel 3 tiene al menos 2k2 nodos
.
El nivel h tiene al menos 2kh-1 nodos

n 2k

h 1

h log k n

Divisin de un rbol B

Borrado

EJEMPLOS

Un rbol de 4 nodos
10

clave < 10

30

10 clave < 30

35

30 clave < 35

35 clave

B vs. B+
En un rbol B los elementos se sitan en los
nodos.
En un rbol B+ los elementos estn en las hojas,
los nodos internos tienen claves que dirigen la
bsqueda.

Las hojas se estructuran como una lista


encadenada para permitir un acceso secuencial
rpido.

Un rbol 2-4+
10

4 7

1 3

15 30

10

16 17

30 40 50

Insertar
14

5 9

1 3

Insertar (2,T).

15 30

14

16 17

30 40 50

Insertar
14

1 2

Insertar (2,T).

15 30

14

16 17

30 40 50

Insertar
14

1 2

Insertar (4,T).

15 30

14

16 17

30 40 50

Insertar
14

1 2 3 4

Insertar (4,T).

15 30

14

16 17

30 40 50

Dividir
14

3 4

Insertar (4,T).

15 30

14

16 17

30 40 50

Corregir
14

3 5 9

3 4

Insertar (4,T).

15 30

14

16 17

30 40 50

Otra insercin
14

3 5 9

3 4

Insertar (6, T).

15 30

14

16 17

30 40 50

Dividir
14

3 5 9

3 4

5 6

Insertar (6, T).

15 30

14

16 17

30 40 50

Otra
14

3 5 9

3 4

5 6

Insertar (7, T).

15 30

14

16 17

30 40 50

Dividir
14

3 5 9

3 4

5 6 7

Insertar (7, T).

15 30

14

16 17

30 40 50

Otra
14

3 5 9

3 4

5 6 7

Insertar (8, T), 1/5.

15 30

14

16 17

30 40 50

Otra
14

3 5 9

3 4

5 6 7 8

Insertar (8, T), 2/5.

15 30

14

16 17

30 40 50

dividir
14

3 5 7 9

3 4

5 6

15 30

7 8

Insertar (8, T) 3/5.

14

16 17

30 40 50

Y dividir
14

7 9

3 5

3 4

5 6

7 8

Insertar (8, T) 4/5.

15 30

14

16 17

30 40 50

Y por ltimo
5 14

7 9

3 4

5 6

7 8

Insertar (8, T), 5/5.

15 30

14

16 17

30 40 50

Insertar
Complejidad de O(log n) y a lo sumo O(logkn)
Cada divisin lleva O(k)
Puede mostrarse que la cantidad de divisiones
tiene una relacin de complejidad O(1) por
cada insercin.

Borrar
5 14

7 9

3 4

5 6

Borrar (14, T).

7 8

15 30

14

16 17

30 40 50

Borrar
5 16

7 9

3 4

5 6

Borrar (14, T).

7 8

30

16 17

30 40 50

Borrar
5 16

7 9

3 4

5 6

Borrar (17, T).

7 8

30

16 17

30 40 50

Borrar
5 16

7 9

3 4

5 6

Borrar (17, T).

7 8

30

16

30 40 50

Borrar
5 16

7 9

3 4

5 6

7 8

Borrar (16, T), 1/5.

30

16

30 40 50

Borrar
5 16

7 9

3 4

5 6

7 8

Borrar (16, T), 2/5.

30

30 40 50

Borrar
5 16

7 9

3 4

5 6

7 8

Borrar (16, T), 3/5.

30

30 40 50

Borrar
5 9

7 9

3 4

5 6

7 8

Borrar (16, T), 4/5.

30

30 40 50

Borrar
5 9

3 4

5 6

7 8

Borrar (16, T), 5/5

30

30 40 50

Borrar
5 9

3 4

5 6

7 8

Borrar (9, T), 1/4.

30

30 40 50

Borrar
5 9

3 4

5 6

7 8

Borrar (9, T), 2/4.

30

30 40 50

Fusionar
5 9

3 4

7 30

5 6

7 8

Borrar (9, T), 3/4.

30 40 50

Y fusionar
5

7 30

3 4

Borrar (9, T), 4/4.

5 6

7 8

30 40 50

Borrado

Quitar la clave.
Si es la nica clave en el nodo, quitar el nodo y
sea v el padre que pierde a un hijo. Si no,
terminar.
(*) si v tiene un hijo, y v es la raz, descartar v.
Si no (v no es una raz), si v tiene un hermano
w de grado 3 o 4, pasar un hijo de w a v y
terminar.
Si no, fusionar v con su hermano a un nodo de
grado 3 y repetir (*) con el padre de v.