You are on page 1of 17

INTRODUCCION RBOLES:

Definiciones:

Un rbol es una coleccin de nodos (del tipo que se


quiera), uno de los cuales se llama raz junto con una
relacin de paternidad que impone una estructura
jerrquica sobre los nodos.
Una manera natural de definirlo es de forma
recursiva:
- Caso base: o el rbol esta vaco o tiene
un solo nodo.
- Caso general: un nodo raz ( r ) y cero o
ms subrboles A1, A2,..., An cada uno
de ellos tiene su raz conectada a r
mediante una arista.

Ejemplo (ndice de un libro):


libro

C1 C2 C3

1.1 1.2 2.1 2.2

2.1.1 2.1.2

Libro seria el nodo raz (r).


Cada subrbol tendra raz C1, C2, C3.
El subrbol con raz C2 tendra como subrboles 2.1 y
2.2.

Partes de un rbol:
Raz: el nodo inicial o base de una estructura
en rbol.
Nodo hoja: el nodo de un rbol que no tiene
hijos.
Dos nodos son hermanos si tienen el mismo
padre.
Un camino de un nodo N1 a otro Nk se define
como la secuencia de nodos N1, N2,..., Nk tal
que Ni es el padre de Ni+1 para 1 <= i < k.
La longitud de este camino es el nmero de
aristas que lo forman, k-1.
Existe un camino de longitud cero entre cada
nodo y l mismo. En un rbol hay exactamente
un camino entre la raz y cada nodo.
Un nodo es antecesor de un segundo si se
encuentra en el camino de la raz a este.
Un nodo es descendiente de un segundo si se
encuentra en el camino de este a algn nodo
hoja.
La profundidad de un nodo es la longitud del
camino nico entre la raz y este.
La altura de un nodo es el camino ms largo
del nodo a una hoja. La altura de un rbol es
la altura de la raz.

Ejemplo:
A

B C D

E F G

H I

Raz: A
Hojas: E, H, I, G, D.
B es padre de E, F.
F es hijo de B y hermano de E.
Camino de B a I, BFI.
Longitud 2.
Profundidad de F 2 y altura 1.
Recorridos:

Para recorrer un rbol se empieza por el nodo raz y


se contina por los hijos, de izquierda a derecha, de tal
manera que en cada nodo, antes de pasar al siguiente
hermano se recorren primero todos sus hijos, tambin de
izquierda a derecha.

Recorrido en orden previo o preorden: en este


modo de recorrido, se trabaja en el nodo antes
de pasar al siguiente.
Recorrido en orden posterior o postorden: en
este, se trabaja en cada nodo una vez que ya
se ha trabajado con todos sus hijos y no
antes.
Recorrido en orden simtrico o inorden: en
esta forma de recorrido se trabaja en los
nodos hoja la primera y nica vez que se pasa
por ellos y en el resto de nodos la segunda
vez.
Ejemplo:
1

2 3 4

5 6 7

8 9 10

Recorrido preorden:

1-2-3-5-8-9-6-10-4-7
Reco
rrido postorden:

2-8-9-5-10-6-3-7-4-1
Rec
orrido inorden:

2-1-8-5-9-3-10-6-7-4
RELACIN CON GRAFOS:

Un grafo se define como sigue:

G = (V, A)

Donde -V (G) es un conjunto finito, no


vaco, de vrtices.
-A (G) es un conjunto de aristas (pares
de vrtices)

Un grafo dirigido es un grafo en el cual solo


puedes ir de un vrtice a otro en una
direccin.
Un grafo tiene un ciclo si posee una
trayectoria sin vrtices repetidos, excepto el
primero y el ltimo. Un grafo diremos que es
acclico si no posee ciclos.
Un grafo es conexo si todo par de vrtices
esta unido por una trayectoria.
Un rbol es un grafo dirigido, acclico y
conexo.
Los rboles abarcadores de coste mnimo son
grafos donde cada arista tiene asociado un
coste, de manera que al moverte de un vrtice
a otro lo hagas por el camino de menor coste.
Ejemplo: Redes de comunicacin.

1 1
6 5
1 1
5
2 3 4 2 3 4
5 5

3 6 4 2 3 4 2
5 6 5 6
6

Grafo rbol abarcador de coste mnimo


TIPOS DE RBOLES BINARIOS:

Un rbol binario es un rbol en el que cada nodo puede


tener dos, uno o ningn hijo.

rboles binarios de expresin:

Las expresiones estn formadas por valores sobre


los que pueden ejecutarse operaciones binarias. Las
distintas partes de la expresin tienen distintos niveles de
procedencia de evaluacin, de tal manera que se puede
escribir una expresin en un rbol binario.

Dependiendo de la forma de recorrer el rbol la


expresin habr que interpretarla de diferente manera.
Para tenerla escrita de la forma habitual habr que
recorrer el rbol en orden simtrico.

Ejemplo de rbol de expresin:

_ +

12 3 4 1

Preorden: *(- (12 3)) (+ (4 1))

Postorden: ((12 3) -) ((4 1) +) *

Inorden: (12 3) * (4 + 1)
Montculos:

- Un rbol binario lleno es un rbol binario en el


que todas las hojas estn al mismo nivel y cada
nodo que no es una hoja tiene dos hijos.
- Un rbol binario completo es un rbol binario
que es lleno o esta lleno hasta el penltimo nivel
tan a la izquierda como sea posible

Un montculo debe ser un rbol binario


completo y para cada nodo del montculo, el valor
almacenado en ese nodo es mayor o igual que el valor de
cada uno de sus hijos.
La caracterstica especial de los montculos es
que siempre sabemos donde esta el valor mximo (en la
raz).Son tiles para la ordenacin.

Ejemplo:
Valor mximo es 10 y se encuentra en la raz del
rbol.
Es un rbol binario completo ya que esta lleno hasta
el penltimo nivel y en el ltimo nivel tiene los nodos
a la izquierda.

10

8 9

4 5 6 7

2 3
rbol binario de bsqueda:

Es un rbol binario en el que el hijo izquierdo, si


existe, contiene un valor ms pequeo que el del nodo
padre y el hijo derecho, si existe, contiene un valor mayor
al del nodo padre.

Aplicaciones de los rboles binarios de bsqueda y


comparacin con listas:
- Facilita la bsqueda, aunque no facilita
los accesos directos como suceda con
los arrays. Suministra un acceso ms
rpido y constante, as es conveniente
para aplicaciones en las que el tiempo de
bsqueda debe minimizarse.
- Ocupa ms espacio que una lista
enlazada (contiene un puntero extra).
- Los algoritmos para manipular el rbol
son ms complicados que los de las
listas.

Ejemplo de rbol binario de bsqueda:

2 8

1 4

La raz es 6 que es mayor que 2 y menor que 8.


As el nodo que contiene el valor 2 es mayor que el valor
del nodo de la izquierda, 1 y menor que el valor del nodo
de la derecha.
Operaciones que suelen darse en los rboles binarios de
bsqueda:

Estructura.

{Declaracin de tipos}
ELEMENTO = T;
NODO = registro de
Valor: ELEMENTO; {Genrico}
izq: puntero a NODO;
der: puntero a NODO;
fin registro;
/* Implementacin en C*/
struct nodo{
int valor;
struct nodo *izq;
struct nodo *der;
};
typedef struct nodo NODO;
Crear rbol.

/*Implementacin en C*/
/*separar memoria para un nodo*/

NODO *getnode()
{NODO *p;
p=(NODO*) malloc (sizeof (NODO));
return p;
}

NODO *crea_arbol (int v)


{NODO *p;
p=getnode();
p->valor=v;
p->izq=NULL;
p->der=NULL;
return p;
}
Comprobar vaci.

Vacia (A: NODO, resp: lgico)


Necesita: un rbol A y un valor lgico resp.
Modifica: resp, indicando si el rbol esta vaci
( falso ) o no (cierto).
/* Implementacin en C*/
int vacio (NODO *arbol)
{if (arbol==NULL) return 1;
else return 0;
}

Buscar: devuelve un putero al nodo del rbol que


tiene el valor buscado o nil si no existe el nodo. Primero se
mira si el rbol esta vaco, en tal caso el resultado sera
nil. Es importante hacer esta comprobacin primero pues
sino intentaras buscar en una estructura vaca, lo que
causara un error al ejecutarlo. Despus se comprueba si
el valor buscado es la raz del rbol y sino se hacen
llamadas recursivas a los subrboles izquierdo y derecho
segn la relacin del valor buscado con la raz.

/*Implementacin en C*/

/*Buscar elementos en un arbol*/


NODO *buscar(int v, NODO *A){
if (vacio(A)==1){
printf ("\n elemento no encontrado");
return NULL;
}
else{
if(v < A->valor) buscar(v,A->izq);
else{
if(v > A->valor) buscar(v,A->der);
else return A;
}
}
}
Buscar_min y buscar_max: Devuelve punteros a los
elementos menor y mayor respectivamente. Se devuelven
punteros, en vez de los valores mximo y mnimo, para
que de esta forma las funciones sean lo ms semejantes
posible a la de buscar, ya que de esta forma se simplifican
las cosas.

/*Implementacin en C*/

/*buscar el minimo de un arbol*/

NODO *buscar_min (NODO *A)


{if (vacio(A)==1) return NULL;
else
{if (A->izq==NULL) return A;
else buscar_min (A->izq);
}
}
Seria muy parecido buscar el mximo.

Insertar: para insertar un nodo X en el rbol A se


llama a la funcin buscar y si X ya esta en el rbol no se
hace nada y sino se encuentra X se aade al final del
camino recorrido.

/*Implementacin en C*/

/*Para insertar elementos*/


NODO *insertar (int v, NODO *A)
{
if (vacio(A)==1) {
A=crea_arbol (v);
if (vacio(A)==1) printf ("\n memoria agotada\n");
}
else
{
if (v < A->valor)
{
if(A->izq==NULL) A->izq=crea_arbol(v);
else insertar(v,A->izq);
}
if (v > A->valor)
{
if(A->der==NULL) A->der=crea_arbol(v);
else insertar(v,A->der);
}
/*Si v ya se encuentra en el arbol no se hace nada*/
}
return A;
}

Eliminar: Hay que tener en cuenta varias


posibilidades:
- Si el nodo es una hoja se puede eliminar
sin ms.
- Si el nodo tiene un hijo hay que ajustar el
puntero del padre al hijo del nodo a
eliminar. Si se quiere liberar el nodo
eliminado hay que conservar un puntero a
este.
- Cuando el nodo a eliminar tiene dos hijos
lo que se hace es sustituir el nodo por el
menor del subrbol derecho y luego se
elimina este ltimo, ya de manera
sencilla dado que no tendr nunca hijo
izquierdo puesto que es el menor del
subrbol.
Si el nmero de eliminaciones esperadas no es
demasiado grande se usa tambin la eliminacin perezosa,
en la que en vez de eliminar realmente un nodo, solo se
marca como eliminado. La penalizacin de tiempo es muy
pequea y si luego se quiere volver a insertar el nodo
eliminado no hace falta tener que crear una celda nueva,
que requiere mucho trabajo, sino slo quitar la marca.

rboles AVL ( Adelson-Velskii y Landis ):

Son rboles binarios de bsqueda con una condicin


de equilibrio, la cual debe ser fcil de mantener. Dicha
propiedad asegura que la profundidad del rbol sea O (log
n).

La idea de equilibrio ms sencilla sera que los


subrboles izquierdo y derecho fuesen igual de profundos,
pero esto no evita que el rbol sea demasiado profundo.
Otra idea seria que todos los nodos tuviesen los dos
subrboles a la misma altura, pero esto, teniendo en
cuenta que la altura de un rbol vaco se define como 1,
se restringe a los rboles de (2^k)-1 nodos, con lo cual no
es muy til.

Los rboles AVL son rboles binarios en los que la


diferencia de altura entre los subrboles de cada nodo no
puede ser superior a uno. Hay que mantener en la
estructura de nodo informacin sobre la altura.

2 8

1 4 7

Todas las operaciones son iguales que en los


rboles binarios de bsqueda, excepto la insercin y la
eliminacin, a no ser que esta sea perezosa, dado que
estas pueden alterar la condicin de equilibrio en el rbol.

Para poder hacer siempre estas operaciones hay


que introducir una modificacin al rbol, la rotacin.
- Rotacin sencilla:

K
k 2
1

K Z K
X
2 1

X Y Y Z

Los dos son rboles binarios de bsqueda. Hay


que tener en cuenta que k1 es menor que k2 en ambos
rboles, que todos los elementos del subrbol X son
menores que k1, todos los elementos del subrbol Z son
mayores que k2 y todos los elementos del subrbol Y
estn entre k1 y k2. La transformacin del uno al otro se
llama rotacin. La rotacin cambia la estructura del rbol,
pero esta no deja de ser un rbol binario de bsqueda.

La rotacin se puede hacer en cualquier nodo del


rbol. Para mantener la condicin de equilibrio de los AVL
lo que se hace cuando se inserta un elemento es ir
recorriendo el rbol desde el nodo insertado hasta la raz,
comprobando a cada paso si se conserva la condicin de
equilibrio y si no es as se hace una rotacin, que en
muchos casos sirve para mantener la condicin de
equilibrio.
6 6

2 8 2 7

1 4 7
1 4 6,5 8

3 6,5
3

- Rotacin doble:

Existe un caso en el que la rotacin simple no recompone


el rbol, ejemplo.

4 4

2 6 2 6

1 3 5 7 1 3 55 15

15 7

14 14

El problema anterior se soluciona con la rotacin doble como se


indica a continuacin:
K
3
K
2
K
1 K K
3 1
A
K
2 D A B C D

B C

Aplicando la rotacin doble al ejemplo nos queda el rbol siguiente:

2 6

1 3 5 14

7 15

rboles desplegados:

En los rboles desplegados, despus de tener


acceso a un nodo, este se lleva hasta la raz.

Si el nodo que se mueve es muy profundo, por


el camino se cambian muchos nodos que son
relativamente profundos, y de esta manera cabe esperar
que con la reestructuracin se hagan tambin ms rpidos
los futuros accesos a estos nodos.

Algunos estudios han demostrado que los


accesos a un nodo al que ya se ha accedido con
anterioridad son mucho ms frecuentes de lo que cabra
esperar, lo cual hace que estos rboles, adems de tener
una buena cota de tiempo en teora sean buenos en la
prctica. Tampoco hace falta mantener la informacin
relativa a la altura o equilibrio, lo que puede ahorrar
espacio y simplificar el cdigo en cierta medida.

Despliegue : rotaremos en el camino de acceso


al nodo de abajo hacia arriba. Si X es un nodo, distinto de
la raz, en el camino de acceso en el que estamos rotando:

- Si el padre de X es la raz, simplemente


rotamos.
- Sino; X tiene un padre ( P ) y un abuelo ( A ):

Zig-zag; X es un hijo izquierdo y P


un hijo derecho ( o al revs ). En
este caso se hace una rotacin
doble como la de los AVL

a
x

D
p p a

A
x A B C D

B C
Zig-zig: ambos, X y P, son hijos
izquierdos ( o derechos )

x
a

p
p D A

B
C a
x

A B C D

You might also like