Anda di halaman 1dari 27

Ingeniera Sistemas Prof. Ing.

Alberto Moreno

1

Semana 15.- rboles


15.1 Conceptos bsicos


Los rboles son una de las estructuras de datos no lineales ms utilizada. Sirve
para representar estructuras de informacin jerrquicas y direcciones o etiquetas
de una manera organizada.

Dentro de la ciencia de la computacin, los rboles tienen muchas aplicaciones
como por ejemplo:

organizar tablas de smbolos en compiladores
representar tablas de decisin
asignar bloques de memoria de tamao variable
ordenar
buscar
solucionar juegos
probar teoremas

Como objetos matemticos los rboles tambin han sido estudiados ampliamente.

Los rboles permiten representar situaciones de la vida diaria como son:

organizacin de una empresa
rbol genealgico de una persona
organizacin de torneos deportivos

Definicin: Un rbol es un conjunto finito T de uno o ms nodos tal que:

a) Existe un nodo especial llamado la raz de rbol
b) Los nodos restantes estn particionados en m > 0 conjuntos disjuntos
T
1
,...,T
m
y cada uno de estos conjuntos es a su vez un rbol. Los rboles
T
1
,...,T
m
son llamados subrboles de la raz

Cualquier nodo es la raz de un subrbol que consiste de l y los nodos debajo de
l. Esto se deriva de la definicin recursiva de rbol presentada.

Un rbol puede representarse grficamente de muchas formas. Algunas de ellas
son por medio de:


Ingeniera Sistemas Prof. Ing. Alberto Moreno

2


conjuntos anidados:


parntesis anidados.

(1(2(4(9,10,11),5),3(6(12),7,8)))

indentacin


grafos



La forma ms comn de representar a los rboles es por medio de un grafo con la
raz hacia arriba:


Ingeniera Sistemas Prof. Ing. Alberto Moreno

3

Cada vrtice o nodo del rbol puede tener un nombre y puede tener una
informacin asociada; un arco es una conexin entre dos vrtices.

Un camino en un rbol es una lista de vrtices diferentes en los que vrtices
sucesivos estn conectados por arcos en el rbol. Una propiedad que define a los
rboles es que existe exactamente un camino entre la raz y cada uno de los otros
nodos en el rbol.

La longitud de un camino es el nmero de nodos del camino menos uno. Por
tanto, hay un camino de longitud cero de cualquier nodo a si mismo.

Se dice que un nodo Y est abajo de un nodo X, si X est en el camino de Y a la
raz. Adems, cada nodo, excepto la raz, tiene exactamente un nodo arriba de l,
que es llamado su padre; los nodos que estn exactamente abajo de l son
llamados sus hijos.

El nmero de hijos que cuelgan de un nodo es llamado el grado del nodo. El grado
de un rbol es el grado mximo de los nodos del rbol. Un nodo de grado cero es
llamado hoja, es decir, no tiene hijos.

Ejemplo:

Considere el siguiente rbol:


Figura 1

El camino del nodo A al nodo P es (A, B, D, J, P), cuya longitud de camino es 4. E
es el padre de K y L.

Los hijos de G son M, N y O.

Los nodos de grado 0 son: I, P, K, L, F, M, N, O, P y H es decir son las hojas del
rbol.

El nico nodo de grado 1 es J.

Los nodos de grado 2 son A, B, D y E.
Ingeniera Sistemas Prof. Ing. Alberto Moreno

4


Los nodos de grado 3 son C y G.

No existen nodos de mayor grado, por tanto, el grado del rbol es 3.

Los nodos de un rbol pueden dividirse en niveles; el nivel de un nodo es el
nmero de nodos en el camino de l a la raz. La altura de un rbol es el nivel
mximo de todos los nodos en el rbol, es decir, la distancia mxima de la raz a
cualquier nodo.

Ejemplo:

A continuacin se muestra el nivel de cada nodo del rbol de la figura 1:


De lo anterior, se ve que el rbol es de altura 4.

A veces la forma en la cual los hijos de cada nodo estn ordenados es importante.
Un rbol ordenado es aquel en el cual el orden de los hijos de cada nodo est
especificado.

Un conjunto de rboles es llamado un bosque. Existe una pequea diferencia entre
un rbol y un bosque; si se elimina la raz de un rbol se obtiene un bosque, y,
recprocamente, si se aade un nodo a un bosque se obtiene un rbol.

Qu es un rbol de grado 0?
Cmo se representa un rbol de grado 1?

En muchas ocasiones los rboles se estudian por su grado, as iniciaremos
estudiando los rboles binarios.

15.2 rboles binarios

Los rboles binarios son el caso particular ms simple. Son usados para
representar ciertos tipos de expresiones algebraicas, algoritmos, bsquedas y
ordenamientos.
Ingeniera Sistemas Prof. Ing. Alberto Moreno

5


Definicin: Un conjunto T de elementos (nodos) es un rbol binario si:

1. T es vaco, o
2. T est particionado en 3 conjuntos disjuntos

a) un solo elemento R, llamado la raz
b) 2 conjuntos que son rboles binarios, llamados los subrboles izquierdo
y derecho de R

de esta forma

T es un rbol binario si

1. T no tiene nodos, o
2. T es de la forma:



donde n es un nodo y TI y TD son rboles binarios.

15.2.1 Representacin ligada de rboles binarios

La representacin ms usada es la ligada o dinmica, donde cada nodo o celda
tiene la siguiente forma:

Un nodo de un rbol puede representarse como:

clase nodoArbol
{
//datos miembro
Objeto info
nodoArbol hijoIzq
nodoArbol hijoDer
//funciones miembro
...
}
Ingeniera Sistemas Prof. Ing. Alberto Moreno

6


Y un rbol como:

clase arbolBinario
{
//datos miembro
nodoArbol raz
//funciones miembro
. . .
}

Ejemplo:




El rbol anterior, en representacin ligada:



15.2.2 Recorrido en rboles binarios

Una vez construido un rbol binario surge la necesidad de recorrerlo, es decir una
manera sistemtica de visitar cada nodo del rbol. La forma en la cual una lista
lineal se recorre es trivial (del primero al ltimo, o viceversa). Sin embargo, para
recorrer un rbol, esta forma natural no puede aplicarse.

Para recorrer un rbol, existen varias formas de lograrlo, las 3 ms comunes son
preorden, inorden y postorden. Estos mtodos difieren en el orden en el cual los
nodos son visitados. Siguiendo la costumbre de empezar a visitar antes lo que se
encuentra a la izquierda que lo de la derecha, se tienen 3 posibilidades de visitar a
la raz (antes, en medio o despus).

Definicin: Para recorrer un rbol binario no vaco T en preorden o previo:

Ingeniera Sistemas Prof. Ing. Alberto Moreno

7

1. visitar la raz
2. recorrer recursivamente el subrbol izquierdo
3. recorrer recursivamente el subrbol derecho

Definicin: Para recorrer un rbol binario no vaco T en inorden o simtrico:

1. recorrer recursivamente el subrbol izquierdo
2. visitar la raz
3. recorrer recursivamente el subrbol derecho

Definicin: Para recorrer un rbol binario no vacio T en postorden o posterior:

1. recorrer recursivamente el subrbol izquierdo
2. recorrer recursivamente el subrbol derecho
3. visitar la raz

A partir de las definiciones anteriores, los mtodos usando una representacin
dinmica son los siguientes:

void previo (nodoArbol T)
comienza
si T <> nil entonces
comienza
visita (T.info)
previo (T.hijoIzq)
previo (T.hijoDer)
termina
termina

void simtrico (nodoArbol T)
comienza
si T <> nil entonces
comienza
simtrico (T.hijoIzq)
visita (T.info)
simtrico (T.hijoDer)
termina
termina

void posterior (nodoArbol T)
comienza
si T <> nil entonces
comienza
posterior (T.hijoIzq)
posterior (T.hijoDer)
visita (T.info)
termina
termina
Ingeniera Sistemas Prof. Ing. Alberto Moreno

8


Ejemplo:

Considere el siguiente rbol:



el resultado que se obtiene al recorrer el rbol en

preorden:
20, 15 10, 5, 12, 18, 17, 19, 33, 25, 21, 27, 50, 40, 70

inorden:
5, 10, 12, 15, 17, 18, 19, 20, 21, 25, 27, 33, 40, 50, 70

postorden:
5, 12, 10, 17, 19, 18, 15, 21, 27, 25, 40, 70, 50, 33, 20

Aunque la recursividad resulta natural en los mtodos anteriores, es posible
implementarlos por medio de una pila. A continuacin se presenta un mtodo para
recorrer un rbol en preorden:

void preorden ()
comienza
p nueva Pila ()
si raiz <> nil entonces
comienza
p.push(raiz)
mientras p.vaca ()
comienza
t p.valTope ()
p.pop()
visita(t)
si t.hijoDer <> nil entonces
p.push (t.hijoDer)
si T.hijoIzq <> nil entonces
p.push (t.hijoIzq)
termina
termina
termina

Ingeniera Sistemas Prof. Ing. Alberto Moreno

9


Otra forma de comn de recorrer un rbol es por niveles, donde el algoritmo
utiliza una cola. Para el rbol anterior el orden en que se visitan los nodos por
niveles es:

20, 15, 33, 10, 18, 25, 50, 5, 12, 17, 19, 21, 27, 40, 70

void niveles ()
comienza
c nuevo Cola ()
si raiz <> nil entonces
comienza
c.inserta (raiz)
repite
t c.valFrente ()
c.borra()
visita(t.info)
si t.hijoIzq <> nil entonces
c.inserta (t.hijoIzq)
si t.hijoDer <> nil entonces
c.inserta (t.hijoDer)
mientras c.vaca()
termina
termina

15.3 rboles binarios de bsqueda

Definicin: Dado un conjunto de nodos (con un campo asignado como llave de
bsqueda) T es un rbol binario de bsqueda si:

1. T es vaco, o
2. T es de la forma



y

a) la llave de bsqueda de n es mayor que todas las llaves de bsqueda de T
I

b) la llave de bsqueda de n es menor que todas las llaves de bsqueda de T
D

c) T
I
y T
D
son rboles binarios de bsqueda

Buscar:

Una ventaja de los rboles binarios de bsqueda es que el algoritmo de bsqueda
Ingeniera Sistemas Prof. Ing. Alberto Moreno

10

surge de una manera natural. Si x es la llave de la raz de un rbol binario de
bsqueda y se est buscando a x, se ha terminado la bsqueda; esto es cierto
suponiendo que las llaves de bsqueda son nicas. Si se busca una llave menor
que x, entonces debe encontrarse en el subrbol izquierdo. Similarmente, si se
busca una llave mayor que x, debe buscarse en el subrbol derecho.

As, puede procederse recursivamente hasta encontrar la llave buscada. El
siguiente algoritmo de bsqueda supone que no existen llaves duplicadas y regresa
una referencia al nodo donde se encuentra la llave de bsqueda o el valor de nil si
la llave no se encuentra en el rbol.

Esto es semejante a realizar una bsqueda binaria.

nodoArbol busca (nodoArbol A, Objeto x)
comienza
si A = nil o A.info.igual (x) entonces
regresa A
otro
si x.menor (A.info) entonces
regresa busca (A.ligader, x)
otro
regresa busca (A.ligaizq, x)
termina

Ejemplo:

Considere el siguiente rbol binario de bsqueda:



Si se busca la llave 7 en el rbol se compara 7 con 10 y se desciende por la
izquierda; se compara 7 con 8 y se desciende por la izquierda; al comparar 7 con 5
se desciende por la derecha y se encuentra la llave.

Insertar:

La insercin en un rbol binario de bsqueda es similar a la bsqueda. Suponga
que se desea insertar una nueva llave con valor x, lo primero que debe hacerse es
una bsqueda, si x se encuentra en el rbol no se requiere insertarla de nuevo (si
se desea que las llaves del rbol sean nicas); en otro caso la bsqueda termina
Ingeniera Sistemas Prof. Ing. Alberto Moreno

11

no exitosamente en una hoja o en un nodo con un solo subrbol; y as un nuevo
nodo que contenga la llave x debe ser insertado debajo de esa hoja, como hijo
derecho o hijo izquierdo, dependiendo del valor de x.

Siguiendo el esquema anterior, se podra modificar el algoritmo de bsqueda
anterior, para que regrese tambin la hoja donde termina la bsqueda, es decir la
raz de donde se debe insertar el nuevo nodo. A continuacin se presenta un
algoritmo de bsqueda no recursivo.

nodoArbol localiza (Objeto x, nodoArbol padre)
comienza
nodo raiz
padre nil
mientras nodo <> nil & nodo.info <> x
comienza
padre nodo
si x < nodo.info entonces
nodo nodo.ligaIzq
otro
nodo nodo.ligaDer
termina
regresa nodo
termina

El algoritmo para insertar una llave en un rbol binario de bsqueda que se
presenta utiliza el procedimiento anterior:

void inserta (Objeto x)
// No se permiten elementos repetidos
comienza
nodo localiza (x, padre)
si nodo <> nil
error (La llave se encuentra)
otro
comienza
nuevoNodo nuevo nodoArbol (x, nil, nil)
si padre.info > x entonces
padre.ligaizq nuevoNodo
otro
padre.ligader nuevoNodo
termina
termina

Borrar:

Por lo general, borrar siempre resulta ms complicado. Lo primero que debe
hacerse para borrar un nodo de un rbol binario de bsqueda es buscarlo. Si la
bsqueda no fue exitosa, no hay nada que hacer; sin embargo, si existe un nodo x
Ingeniera Sistemas Prof. Ing. Alberto Moreno

12

con la llave de bsqueda que se desea borrar, con padre P, entonces ese nodo
puede:

a) ser una hoja
b) tener un nico hijo
c) tener dos hijos

A continuacin se presenta cada uno de stos casos para su estudio.


a) El nodo a eliminar es una hoja

Este caso es el ms sencillo, en el cual lo nico que hay que hacer, es que la liga
que lo referencia debera ser nil.

Considere el siguiente rbol:



Si se desea borrar el nodo con llave de bsqueda 6 el rbol queda como:



Si se hubiera eliminado el nodo con llave de bsqueda 4 del rbol original entonces
el rbol debera quedar como:

Para eliminar una hoja

nodo localiza (x, padre)
si nodo es una hoja
//nodo.ligaDer =
nil & nodo.ligaIzq = nil
comienza
si x < padre.info
padre.ligaIzq nil
otro
padre.ligaDer nil
termina

Ingeniera Sistemas Prof. Ing. Alberto Moreno

13


b) El nodo que se desea eliminar tiene un nico hijo

En ste caso para eliminar un nodo su padre deber referenciar a su hijo. Por
ejemplo considere el siguiente rbol:



Si se desea eliminar el nodo con llave de bsqueda 4, se debe cambiar el subrbol
izquierdo de 5 por el subrbol que contiene a 2 como raz.


Esto mismo ocurre cuando se trata de eliminar un nodo con un nico subrbol
izquierdo, suponga ahora que deseamos eliminar el nodo cuya informacin es 6 del
rbol mostrado en la figura anterior. En este caso bastara con que el subrbol
izquierdo de 8 referenciar al subrbol derecho del 6 (nodo 7). Hecho lo anterior el
nuevo rbol se presenta a continuacin:


//el nodo tiene un solo hijo izquierdo
si nodo.ligaIzq <> nil & nodo.ligaDer = nil
si x < padre.info
padre.ligaIzq nodo.ligaIzq
otro
padre .ligaDer nodo.ligaIzq
// el nodo tiene un solo hijo derecho
otro si nodo.ligaIzq = nil & nodo.ligaDer <> nil
Ingeniera Sistemas Prof. Ing. Alberto Moreno

14

si x < padre.info
padre.ligaIzq nodo.ligaDer
otro
padre.ligaDer nodo.ligaDer

c) El nodo que se desea eliminar tiene dos hijos

En este caso se debe sustituir el valor de la informacin del nodo que se desea
borrar por el nodo que contiene la menor llave que se encuentra en el subrbol
derecho o bien la llave mayor del subrbol izquierdo, esto es necesario para no
perder la propiedad de rbol binario de bsqueda. En cualquier eleccin que se
tome, (el menor de los mayores o el mayor de los menores), el nodo que contiene
esa informacin a lo ms tendr un hijo, por lo que su eliminacin es fcil de
realizar.

Considere el siguiente rbol:



Si se desea eliminar la raz (que tiene 2 hijos) del rbol anterior, se puede
substituir la llave 8 por la 7, y despus eliminar el nodo que lo contiene, es decir,
el rbol quedara como:



o bien substituirla por el menor de los mayores, es decir, la llave 9, el rbol
quedara:

Ingeniera Sistemas Prof. Ing. Alberto Moreno

15



A continuacin se presenta el algoritmo general para borrar un nodo de un rbol
binario de bsqueda:

void borra (Objeto x)
comienza
nodo localiza ( x, padre)
si nodo = nil entonces
error (no existe)
otro
comienza
si nodo.hijoDer = nil & nodo.hijoIzq = nil entonces
substituye(nodo, padre, Nodo.hijoDer)
otro
si nodo.hijoDer = nil entonces
substituye( nodo, padre, nodo.hijoIzq)
otro si nodo.hijoIzq = nil entonces
substituye(nodo, padre, Nodo.ligader)
otro
comienza
max MaxMin(nodo, padreMax)
nodo.info max.info
substituye (max, padreMax, max.hijoIzq)
termina
termina
termina

La funcin para encontrar el mayor de los menores es el siguiente:

nodoArbol MaxMin (nodoArbol nodo, nodoArbol padreMax)
comienza
max nodo.hijoIzq
padreMax nodo
mientras max.hijoDer <> nil
comienza
padreMax Max
max max.hijoDer
termina
MaxMin max
termina

Ingeniera Sistemas Prof. Ing. Alberto Moreno

16

void substituye (nodoArbol nodo, nodoArbol padre, nodoArbol liga)
comienza
si padre.info > nodo.info entonces
padre.hijoIzq liga
otro
padre.hijoDer liga
termina


15.4 rboles balanceados

Definicin: Un rbol es perfectamente balanceado, si para cada nodo los nmeros de
nodos en sus subrboles izquierdo y derecho difieren a lo ms en uno.

Ejemplo:

Construir un rbol con 15 nodos cuya informacin es:

a b d h o i p e j q k c f l r

insertar a:

insertar b:

insertar d:

insertar h, es necesario agregar un nivel al rbol:

insertar o, para que se rompa la propiedad de perfectamente balanceado es necesario que
el nuevo nodo sea hijo de d:
Ingeniera Sistemas Prof. Ing. Alberto Moreno

17


si insertamos a i y luego a p, deberemos colocarlos como hijos derechos de b y d
respectivamente:

para insertar e deberemos aumentar un nivel al rbol

finalmente para insertar a q, k, c, f , l, r no necesitamos aumentar la altura del rbol:



NodoArbol arbolPerfBal (int n)
// n es el nmero de nodos del rbol perfectamente balanceado
comienza
si n = 0 entonces
regresa nil
otro
comienza
ni n div 2
nd n-ni-1
lee x //la informacin la proporciona el usuario
nuevoN new NodoArbol (x)
nuevoN.ligaizq arbolPerfBal (ni)
Ingeniera Sistemas Prof. Ing. Alberto Moreno

18

nuevoN.ligader arbolPerfBal (nd)
regresa nuevoN
termina
termina

Definicin: Un rbol es balanceado si y solo si para cada nodo las alturas de sus dos
subrboles difieren a lo ms en uno.

Los rboles que cumplen con esta definicin se conocen como rboles AVL (Adelson-
Velskii y Landis) o simplemente rboles balanceados.


rboles llenos y completos:

Los rboles binarios pueden tener muchas formas. Por ejemplo:



Ingeniera Sistemas Prof. Ing. Alberto Moreno

19


Aunque cada uno de los rboles anteriores tiene el mismo nmero de nodos, algunos son
ms altos que otros.
Definicin: El nivel de un nodo n en un rbol T es:

a) 1, si n es la raz del rbol T
b) el nivel de su padre mas uno, si n no es la raz de T

La altura de un rbol puede definirse en trminos de los niveles de sus nodos:

(1) Si T es vaco, entonces tiene altura cero
(2) Si T es no vaco, entonces su altura es igual al mximo nivel de sus nodos

o bien,

(1) Si T es vaco, entonces tiene altura cero
(2) Si T no es vaco, entonces es de la forma:

n

A
I
A
D

en este caso la altura de T est definida como la altura del ms grande subrbol mas uno,
esto es:

altura (A) = max { altura (A
I
), altura (A
D
) } +1

Dado un rbol binario con N nodos, cul es la altura mxima y cul la mnima?
Ingeniera Sistemas Prof. Ing. Alberto Moreno

20


mxima: cada nodo un hijo

mnima: El nmero de nodos depende de la altura. Por ejemplo, si h = 3:



se puede tener entre 3 y 7 nodos. De la figura anterior 3 es la altura mnima para rboles
con 4, 5, 6 7 nodos.

Intuitivamente, si un rbol de altura h tiene el mximo nmero de nodos, entonces todas
sus hojas estn en el nivel h y los nodos de nivel menor tienen dos hijos.

Es decir, el nmero mximo de nodos en un rbol binario de altura h se alcanza si todos
los nodos tienen dos subrboles, excepto los situados en el nivel h, que no tienen
ninguno.

Tales rboles se conocen como llenos de altura h.

Definicin: Un rbol binario T es lleno s:

(1) T es vaco, en cuyo caso es un rbol lleno de altura cero, o
(2) T es un rbol de altura h (h>0) y sus dos subrboles son llenos de altura h-1

Un rbol binario lleno de altura h contiene el mximo nmero posible de nodos para un
rbol binario de altura h, i.e., un rbol binario lleno de altura h tiene 2
h
- 1 nodos.

Se puede definir informalmente un rbol completo (semi-lleno) de altura h como un rbol
lleno de nivel h-a con el nivel h completo de izquierdo a derecha. Ms formalmente, un
rbol binario T es un rbol completo de altura h s:

Ingeniera Sistemas Prof. Ing. Alberto Moreno

21

(1) T es vaco, o
(2) El subrbol izquierdo de T es un rbol lleno de altura h-1 y el subrbol derecho de T es
un rbol completo de altura h-1, o
(3) El subrbol izquierdo de T es un rbol lleno de altura h-1 y el subrbol derecho de T es
un rbol lleno de altura h-2, o
(4) El subrbol izquierdo de T es un rbol completo de altura h-1 y el subrbol derecho de
T es un rbol lleno de altura h-2



Note que si un rbol es lleno, entonces necesariamente es completo.

Existe una representacin basada en arreglos de un rbol binario completo, en la cual el
nodo 1 (la raz) se almacena en la posicin 1, el nodo 2 en la posicin 2 y as
sucesivamente. De tal forma, que dado un nodo, podemos localizar fcilmente sus hijos y
su padre. Para un nodo i, su hijo izquierdo, si existe, se encuentra en la posicin 2*i, su
hijo derecho, si existe, se encuentra en la posicin (2*1)+1, y su padre, suponiendo que i
no es la raz se encuentra en la posicin (i div 2). El rbol anterior se representara como:



Esta representacin secuencial es apropiada para rboles binarios completos y cuyo
mximo nmero de nodos se conoce.

Colas de prioridad Montculos (Heaps)
Ingeniera Sistemas Prof. Ing. Alberto Moreno

22


Aun cuando los trabajos enviados a una impresora en lnea se suelen colocar en una cola,
esto puede no ser siempre lo mejor. Por ejemplo, un trabajo puede ser de particular
importancia, de modo que es deseable permitir que se lleve a cabo tan pronto como la
impresora est disponible. A la inversa, si al quedar disponible la impresora hay varios
trabajos de una pgina y uno de cien, puede ser razonable dejar el trabajo grande para el
final, aun cuando no sea el ltimo enviado. (Desafortunadamente, la mayora de los
sistemas no hacen esto)

De manera similar, en un entorno multiusuario, el planificador del sistema operativo debe
decidir entre varios procesos cul ejecutar. En general se permite que un proceso se
ejecute slo durante un tiempo fijo. Un esquema (algoritmo) usa una cola donde al inicio
los trabajos se colocan al final de la cola y el planificador tomar repetidamente el primer
trabajo de la cola, lo ejecutar hasta que termine o alcance su lmite de tiempo, y lo
colocar al final de la cola si no termina. Por lo general, esta estrategia no es adecuada
porque trabajos muy cortos parecern lentos debido al tiempo de espera para su
ejecucin. Por lo regular, es importante que los trabajos cortos terminen tan pronto como
sea posible, de modo que estos trabajos deberan tener preferencia sobre los trabajos que
ya han estado en ejecucin. Adems, algunos trabajos no cortos son muy importantes y
deben tambin tener preferencia.

Esta aplicacin particular parece requerir una clase especial de cola, denominada cola de
prioridad o montculo.

Un montculo es una estructura de datos similar a un rbol binario de bsqueda pero
ordenado de distinta forma por prioridades y adems se representa siempre como un
rbol binario completo representado como un arreglo.

Definicin:

Un montculo es un rbol binario completo tal que:

a) es vaco, o
b) el valor de la prioridad en la raz es mayor o igual que la prioridad de cualquiera de sus
hijos, y
c) ambos subrboles son montculos

Nota: en el inciso b) la palabra mayor puede substituirse por menor.

Ejemplo:

Ingeniera Sistemas Prof. Ing. Alberto Moreno

23


que en un arreglo aparecera representado como:



Los montculos pueden utilizarse para implementar una cola de prioridades. La estructura
de datos puede definirse de la siguiente manera:

clase Montculo
{
int ltimo //ltima posicin ocupada de info
Objeto [] info

Montculo ()
bool vaca ()
borra ()
inserta (Objeto x)
}

Mtodo constructor:

Montculo ()
comienza
ltimo 0
info nuevo Objeto [MAX]
termina

Ingeniera Sistemas Prof. Ing. Alberto Moreno

24

Vaca:

bool vaca ( )
comienza
regresa ltimo = 0
termina

Borrar:

Es fcil demostrar por induccin que la llave mayor de un rbol binario con la propiedad
de montculo se encuentra almacenada en la raz. En general, cuando la llave en la raz es
eliminada, el nodo que la contiene no puede eliminarse ya que quedaran dos hijos sin
padre, por lo tanto necesitamos un mtodo que reestablezca la propiedad de montculo.

Suponga que cualquier hoja es eliminada y la llave es transferida a la raz. Claramente la
propiedad de heap puede ser violada. Por ejemplo, considere el rbol anterior
(representado en la siguiente figura del lado izquierdo), donde se desea eliminar la raz,
sustituyndola por alguna hoja (representado en la siguiente figura del lado derecho)


El problema aqu es que el elemento de la raz no satisface la propiedad de montculo.
Esta estructura es llamada un semimontculo y ahora se puede considerar la estrategia de
transformar el semimontculo en un montculo.

La nica violacin de la propiedad de montculo antes de la restauracin es que la llave K
en el rbol sea muy pequea. Si es as, se puede cambiar a K con la llave de su hijo ms
grande, y entonces la nueva llave de la raz ser ms grande que las llaves de sus hijos.
Ahora la nica posible violacin de la propiedad de montculo es de nuevo que K sea muy
pequea y deba moverse un nivel hacia abajo. Esto puede manejarse a travs de llamadas
recursivas y eventualmente se obtendr la propiedad de montculo hasta que quiz K no
tenga hijos.

Considere lo anterior de manera grfica:

El rbol anterior cuya raz es 10 y tiene como hijos al 50 y al 40, para restablecer la
propiedad de montculo y como 50 es el mayor se intercambia su valor con el 10:
Ingeniera Sistemas Prof. Ing. Alberto Moreno

25


Con este cambio ahora el semimontculo se encuentra con raz en el nodo numerado con
el 2, porque 10 es menor que 30 y 20, lo cual nos lleva a intercambiar el valor de 30 hacia
la raz:



Como puede observarse en la representacin de almacenamiento contiguo es fcil definir
funciones que regresen al hijo izquierdo y al hijo derecho. Cada funcin toma como
argumento un ndice del arreglo.

Objeto borra ()
comienza
aux info[0]
info[0] info[ltimo]
ltimo --
ajustaAbajo (0)
termina

void ajustaAbajo (int origen)
comienza
si ((2*origen) < ltimo) entonces
comienza
si (info[origen] < info[2*origen]) or
info[origen] > info[(2*origen)+1]
comienza
si (info[(2*origen)+1] < info[2*origen])
nodo 2*origen
otro
nodo (2*origen) +1
Intercambia (origen, nodo)
ajustaAbajo (nodo)
Ingeniera Sistemas Prof. Ing. Alberto Moreno

26

termina
termina

void intercambia (int nodo1, int nodo2)
comienza
aux info[nodo1]
info[nodo1] info[nodo2]
info[nodo2] aux
termina

Insertar:

El algoritmo de insercin trabaja en forma contraria a la de borrar. En este caso, una llave
K desea insertarse en un montculo. Esta puede insertarse en cualquier localidad
disponible del rbol, de esta forma, la nica violacin que puede ocurrir es que K sea ms
grande que su padre y que necesite moverse un nivel hacia arriba en el rbol.

En la representacin de almacenamiento secuencial, simplemente se incrementa el
tamao del montculo en uno y se incluye la nueva llave al final de las n llaves que forman
el rbol y verificamos que se cumpla la propiedad de montculo. En el caso que no se
cumpla ser necesario intercambiar su valor con el de su padre hasta que su padrea sea
mayor que l.


void inserta (Objeto k)
comienza
ltimo ++
info[ltimo] k
ajustaArriba(ltimo)
termina

void ajustaArriba (int origen)
comienza
padre origen div 2
si padre > 0
comienza
si info [padre] < info[origen]
comienza
intercambia (padre, origen)
ajustaArriba (padre)
termina
termina
termina


Suponga ahora, que se tiene un rbol binario completo cuyas llaves no cumplen la
propiedad de montculo cmo convertirlo en un montculo?

Una forma de resolver el problema consiste en convertir cada subrbol en un montculo,
Ingeniera Sistemas Prof. Ing. Alberto Moreno

27

as se tiene un rbol con raz y dos subrboles que son montculos, el rbol completo ser
un montculo si se intercambia la llave del nodo raz con la llave mayor de sus dos hijos:

void convMontculo (int raz)
comienza
si raz < ltimo entonces
comienza
convMontculo (2*raz)
convMontculo ( (2*raz)+1)
ajustaAbajo (raz)
termina
termina

Anda mungkin juga menyukai