Está en la página 1de 18

9.

Arboles

Una estructura de datos con una relacin es una rbol si y slo: o a o La relacin es conexa, es decir, existe una composicin de relaciones entre cualquier par de o o nodos en el rbol. a No admite ciclos. Denicin: Un rbol T es un conjunto nito de uno o ms nodos tal que: (i) hay un nodo especialo a a mente llamado ra R; (ii) los dems nodos estn particionados en n 0 conjuntos desconectados z a a T1 . . . Tn , donde cada uno de estos conjuntos es un rbol, as llamados subrboles de la ra As a a z. : T Ti Tn = Padre: El nodo inmediatamente antecesor Hijos: nodos inmediatamente sucesor Grado: nmero de hijos de un nodo u Nivel: distancia a la ra de un nodo z Profundidad: nivel mximo de un rbol a a Bosque: rboles desconectados a Formas de visualizar un rbol son: a Grco: a
A B C D

= {R} T1 . . . Tn

(2)

E K L

H M

Listas: (A(B(E(K,L),F),C(G),D(H(M),I,J))) 50

Data

1 0 C 0 G 0

0 D 1

M 0

0 0 I 0 J 0

La representacin es esencialmente por listas encadenadas o Teoremas: El rbol es conexo pero al eliminar un arco, se convierte en no conexo a El rbol no tiene ciclos y es conexo, arcos = nodos 1 a Al agregar un arco a un rbol se crea un ciclo. a

10.

Arbol Binario

Denicin: Un rbol binario es un nmero nito de nodos que es vac o consiste de una ra con o a u o z dos rboles binarios desconectados llamados subrbol izquierdo y derecho. Se llaman los nodos que a a no tienen hijos, nodos hojas o terminales. Nodos con uno o dos hijos son llamados nodos internos.

51

structureBTREE(ITEM) declare N EW () btree M AKEBT REE(btree, item, btree) btree LCHILD(btree) btree RCHILD(btree) btree DAT A(btree) item IS IN (btree, item) boolean IS EM P T Y (btree) boolean for all bt1 , bt2 BT REE, i, i1 , i2 item let DAT A(N EW ()) ::= error DAT A(M AKEBT REE(bt1 , i, bt2 )) ::= i IS EM P T Y (N EW ()) ::= true IS EM P T Y (M AKEBT REE(bt1 , i, bt2 )) ::= f alse IS IN (N EW (), i) ::= f alse IS IN (M AKEBT REE(bt1 , i1 , bt2 ), i2 ) ::= if i1 = i2 then true else IS IN (bt1 , i2 ) IS IN (bt2 , i2 ) LCHILD(N EW ()) ::= N EW () LCHILD(M AKEBT REE(bt1 , i, bt2 )) ::= bt1 RCHILD(N EW ()) ::= N EW () RCHILD(M AKEBT REE(bt1 , i, bt2 )) ::= bt2 Lema: El mximo nmero de nodos en un nivel i de un rbol binario es 2i , i 0; y el mximo a u a a k+1 1, k 0. nmero de nodos en un rbol binario de profundidad k es 2 u a Prueba Por induccin o Base induccin: La ra es el unico nodo en el nivel 0. Por lo tanto, el mximo nmero de nodos o z a u en el nivel i = 0 es 20 = 2i . Hiptesis de induccin: Para todo j, 0 j i, el mximo nmero de nodos en el nivel j es 2j . o o a u Paso de induccin: El mximo nmero de nodos en el nivel i 1 es 2i1 , por la hiptesis de o a u o induccin. Debido a que cada nodo del rbol tiene como mximo grado 2, el nmero de nodos o a a u mximos en el nivel i es 2 veces el mximo nmero de nodos en el nivel i 1 o 2i . El mximo a a u a nmero de nodos n en un rbol binario de profundidad k es la sumatoria del mximo nmero de u a a u nodos en cada nivel:
k

n=
i=0

2i = 2k+1 1

Lema: Por cada rbol binario no vac T , si n es el nmero de nodos terminales (hojas) y m es el a o u nmero de nodos de grado 2, entonces n = m + 1. u Prueba: Sea l el nmero de nodos de grado uno, entonces el nmero total de nodos N en el rbol u u a es N = n + m + l. Todos los nodos en el rbol excepto por la ra tienen un arco de llegada. Entonces, N es igual al a z nmero de arcos B + 1. Tambin, todo arco emana de un nodo de grado uno o de grado dos. As u e : B = l + 2m. Por lo tanto N = 1 + l + 2m. Substrayendo N = 1 + l + 2m de N = n + m + l nos queda que n = m + 1. 52

10.1.

Representacin por arreglos o

Un rbol binario se representa en un arreglo del siguiente modo: si un nodo ocupa la posicin i, a o entonces su hijo izquierdo ocupa la posicin 2i y su hijo derecho la posicin 2i + 1. o o Si un rbol es completo con n nodos, por cada nodo i , 1 i n, tenemos: a PARENT(i) est localizado en i/2 si i = 1. Cuando i = 1, i es la ra y no tiene padre. a z LCHILD(i) est en 2i si 2i n. Si 2i > n entonces no tiene hijo izquierdo. a RCHILD(i) est en 2i + 1 si 2i + 1 n. Si 2i + 1 > n, entonces no tiene hijo derecho. a Esta forma de representacin no es muy usada por problemas de prdida de espacio. o e

10.2.

Representacin por punteros o

Usando punteros, cada nodo es un registro con tres campos: el dato, el puntero al hijo izquierdo y el puntero al hijo derecho. Caminamiento en un rboles binario T : a Procedure IN ORDER(T ) if T = nil do [ call IN ORDER(LCHILD(T )) print(DATA(T)) call IN ORDER(RCHILD(T )) ] end IN ORDER Procedure P REORDER(T ) if T = nil do [ print(DATA(T)) call P REORDER(LCHILD(T )) call P REORDER(RCHILD(T )) ] end P REORDER Procedure P OST ORDER(T ) if T = nil do [ call P OST ORDER(LCHILD(T )) call P OST ORDER(RCHILD(T )) print(DATA(T)) ] end P OST ORDER Si T es un rbol binario con ra de n nodos, el caminamiento en el rbol toma (n). Sea T (n) el a z a tiempo que toma el recorrido de un rbol binario de n nodos. El menor tiempo posible es el de un a a rbol vac T (0) = c para alguna constante positiva c. Para n > 0, suponga que la llamada al reo corrido ocurri en un nodo x ra con k nodos en el subrbol izquierdo y nk1 hijos en el subrbol o z a a derecho. El tiempo de recorrido es T (n) = T (k)+T (nk1)+dparaalgunaconstantepositivad que reeja el tiempo de ejecucin en el nodo ra (o sea, el tiempo de las llamadas recursivas esencialo z mente). Provemos que T (n) = (c+d)n+c. Para n = 0, nosotros tenemos que (c+d)0+c = c = T (0). 53

Para n > 0 tenemos que: T (n) = T (k) + T (n k 1) + d = ((c + d)k + c) + ((c + d)(n k 1) + c) + d (3)

= (c + d)n + c

= (c + d)n + c (c + d) + c + d

Esto demuestra que T (n) = (c + d)n + c y esto es (n).

10.3.

Arboles Binarios de B squeda u

Un rbol binario de bsqueda es un rbol binario donde la ra es siempre mayor que los nodos del a u a z subrbol izquierdo y menor que todos los nodos del subrbol derecho. a a structureBBTREE(ITEM) declare N EW () bbtree M BT REE(bbtree, item, bbtree) btree IN SERT (item, bbtree) bbtree IS EM P T Y (btree) boolean IS IN (bbtree, item) boolean M IN IM U M (bbtree) item M AXIM U M (bbtree) item for all bt1 , bt2 BT REE, i, i1 , i2 item let IN SERT (i, N EW ()) ::= M BT REE(N EW (), i, N EW ()) IN SERT (i, M BT REE(bbt1 , i, bbt2 )) ::= M BT REE(bbt1 , i, bbt2 ) IN SERT (i, M BT REE(bbt1 , i2 , N EW ())) ::= if i > i2 then M BT REE(bbt1 , i2 , M BT REE(N EW (), i, N EW ())) else M BT REE(IN SERT (i, bbt1 ), i2 , N EW ()) IN SERT (i, M BT REE(N EW (), i2 , bbt2 )) ::= if i < i2 then M BT REE(M BT REE(N EW (), i, N EW ()), i2 , bbt2 ) else M BT REE(N EW (), i2 , IN SERT (i, bbt1 )) IN SERT (i, M BT REE(bbt1 , i2 , bbt2 )) ::= if i < i2 then M BT REE(IN SERT (i, bbt1 ), i2 , bbt2 ) else M BT REE(bbt1 , i2 , IN SERT (i, bbt1 )) IS EM P T Y (N EW ()) ::= true IS EM P T Y (M BT REE(bbt1 , i, bbt2 )) ::= f alse IS IN (N EW (), i) ::= f alse IS IN (M BT REE(bbt1 , i1 , bbt2 ), i2 ) ::= if i1 = i2 then true else if i2 < i1 then IS IN (bt1 , i2 ) else IS IN (bt2 , i2 ) M IN IM U M (N EW ()) ::= error M IN IM U M (M BT REE(N EW (), i, bbt2 )) ::= i M IN IM U M (M BT REE(bbt1 , i, bbt2 )) ::= M IN IM U M (bbt1 ) M AXIM U M (N EW ()) ::= error M AXIM U M (M BT REE(bbt1 , i, N EW ())) ::= i M AXIM U M (M BT REE(bbt1 , i, bbt2 )) ::= M AXIM U M (bbt2 ) 54

Los algoritmos de rboles binarios de bsqeuda son: a u B squeda: u Procedure BU SCAR(N, T ) // N es el valor buscado // T es la ra del rbol binario de bsqueda z a u if T = nil do [ if N = DAT A(T ) then return T else if N < DAT A(T ) then return BU SCAR(N, LCHILD(T )) else BU SCAR(N, RCHILD(T )) ] else return no se encontr o end BU SCAR Procedure BU SCAR(N, T ) // no recursivo // N es el valor buscado // T es la ra del rbol binario de bsqueda z a u p := T while p = nil do [ if N = DAT A(p) then return p else if N < DAT A(p) then p := LCHILD(p) else p := RCHILD(p) ] return no se encontr o end BU SCAR En el peor caso, la bsqueda llega hasta la hoja de unrbol pasando por un camino desde la u a ra hata la hoja, es decir, es un camino de largo h, con h siendo la profundidad. z M nimo y Mximo: a Procedure M IN IM U M (x) // x nodo del rbol binario de bsqueda a u while LCHILD(x) = nil do [ x := LCHILD(x) ] return x end M IN IM U M Procedure M AXIM U M (x) // x es un nodo del rbol binario de bsqueda a u while RCHILD(x) = nil do [ x := RCHILD(x) ] return x end M AXIM U M Ambos Algoritmos tienen complejidad O(h) ya que ambos siguen el camino desde la ra a la z hoja ms izquierda o derecha del rbol. a a Sucesor y Predecesor:

55

Procedure SU CESSOR(x) // x es un nodo en el rbol a //P AREN T (x) obtiene el padre de x if RCHILD(x) = nil then return M IN IM U M (RCHILD(x)) y := P AREN T (x) while y = nil and x = RCHILD(y) do [ x := y y := P AREN T (y) ] return y end SU CESSOR Si un nodo x tiene un subrbol derecho, el sucesor y es el m a nimo valor del subrbol derecho. a Si un nodo no tiene subrbol derecho y tiene sucesor y, entonces, el sucesor y es el menor a ancestor de x cuyo hijo izquierdo es tambin un ancestor de x. e La complejidad del algoritmo es O(h) porque sigue el camino hacia una hoja del subrbol a derecho o sigue hacia arriba el camino hasta la ra z El algoritmo P redecessor(x) es simtrico y con el mismas complejidad. e Insertar y Borrar: Procedure IN SERT AR(P, T ) // P es el nodo a insertar // T es la ra del rbol binario de bsqueda z a u if DAT A(T ) = DAT A(P ) then return existe else if DAT A(P ) < DAT A(T ) then [ if LCHILD(T ) = nil then [ LCHILD(T):= P return ] else IN SERT AR(P, LCHILD(T ))] else if RCHILD(T ) = nil then[ RCHILD(T):= P return ] else IN SERT AR(P, RCHILD(T )) end IN SERT AR En el peor caso, la insercin en un rbol se hace en un nodo hoja, lo que queda dado por la o a profundidad del rbol O(h)antes de insertar. Ojo, al insertar, esta profundidad puede variar. a

56

Procedure DELET E(P, T ) // P es el nodo a eliminar // T es la ra del rbol binario de bsqueda z a u if LCHILD(P ) = nil and RCHILD(P ) = nil then y := P else y := SU CCESSOR(P ) if LCHILD(y) = nil then x := LCHILD(y) else x := RCHILD(y) if x = nil then [ P AREN T (x) := P AREN T (y) if P AREN T (y) = nil then T := x else if y = LCHILD(P AREN T (y)) then LCHILD(P AREN T (y)) := x else RCHILD(P AREN T (y)) := x if y = x then DATA(P) := DATA(y) copia de informacin de punteros o return y end DELET E Para borrar se consideran 3 casos. Si P no tiene hijos, modique el padre de P para reemplazar P por nil como su hijo.
N H T N H T

B A D I J K

L M P

U A

B D I J K

57

Si P tiene slo un hijo, se divide P haciendo un nuevo enlace entre su hijo y su padre. o

N H T

N H T

B A D I J K

L M P

U A

B D I

L M J P

Finalmente, si el nodo tiene dos hijos, se divide el sucesor de P , y, el cual no tiene hijo izquierdo y se reemplaza la clave de P y sus punteros con la clave de y y sus informacin de o punteros.
N I T

N H T

B A D I J K

L M P

U A

B D J K

L M P

Problema: La eciencia de un mtodo depende de que el rbol de bsqueda est balanceado. Ene a u e tonces, cmo mantener el rbol balanceado? o a Denicin: en un rbol de bsqueda balanceado (AVL) la profundidad del subrbol izquierdo es o a u a igual a la profundidad del subrbol derecho 1. A su vez, esta profundidad es satisfecha recursivaa mente por los subrboles. Por ejemplo: a

58

M H T

B A D

J P

Supongamos que tenemos un rbol binario de bsqueda balanceado y le insertamos un nuevo nodo. a u El caso simple es cuando el rbol continua siendo balanceado. a

B A C

B C

El problema sucede cuando al insertar el nodo, se desbalancea el rbol. Eso sucede en dos caso a posibles:

B C

B C

La solucin es rotar el rbol una vez insertado el nodo. En el primer caso, la rotacin es simple y o a o se hace en el sentido contrario al desbalanceo. El segundo caso, es necesario hacer dos rotaciones ya que el desbalanceo se produce en el sentido contrario a la insercin: o

59

B C C + D A C + B A B C B D

En ambos casos, los rboles resultantes mantienen la profundidad inicial. a Otra situacin a considerar es al borrar un nodo de un rbol que est balanceado y que se desbao a a lancea.

B A C D A

B D C

Al igual que para insercin se deben realizar rotaciones. A diferencia de cuando se inserta, sin emo bargo, los rboles resultantes pueden cambiar su profundidad y por lo tanto, no se puede garantizar a que el balanceo del subrbol mantenga el rbol que lo contenga balanceado. a En resumen: Al insertar: 1. usar bsqueda binaria para ver donde insertar, e insertar el nodo u 2. desde all hacia arriba, chequear donde ocurre el desbalanceo. 3. hacer la rotacin adecuada. o Al eliminar: 1. borrar el nodo 2. ubicar punto de desbalanceo (nico si existe) u 3. hacer la rotactin correspondiente o 60

4. si cambi profundidad volver al punto 2 o Por ejemplo, en la siguiente gura, al ingresar la clave 20 se producen dos desbalances. La rotacin o sobre el nodo con valor 11 soluciona slo un debalance. o

4 3 2 6 8 12 9

11 18 14 17 20 rotacin izquierda 7 19 22

4 3 2 9 6 8 12 11

18 19 14 17 22 20

Sin embargo, al tomar el desbalance mas profundo (ms cercano a la hoja donde se inserta el a elemento) y su balanceo, el rbol vuelve a estar balanceado. a

61

4 3 2 6 8 12 9

11 18 14 17 20 19 22

rotacin doble

4 3 2 9 6 8 12 11

18 20 14 19 17 22

Algoritmos de rotacin: Asume que X tiene hijo derecho. o

Y X

right rotation(T,y)

X Y

left rotation(T,y)

62

Procedure LEF T ROT AT ION (T, x) // x nodo de rotatcin o // T es la ra del rbol binario de bsqueda z a u y := RCHILD(x) RCHILD(x) := LCHILD(y) if LCHILD(y) = nil then P AREN T (LCHILD(y)) := x P AREN T (y) := P AREN T (x) if P AREN T (x) = nil then T := y else if x = LCHILD(P AREN T (x)) then LCHILD(P AREN T (x)) := y else RCHILD(P AREN T (x)) := y LCHILD(y) := x PARENT(x) := y end LEF T ROT AT ION (T, x)

63

Ejercicios de rboles binarios y rboles binarios de b squeda a a u

1. Combinando preorden con inorder. Dado una secuencia de un rbol binario en preorden y a otra en inorden, es posible denir el unico rbol que las dene. a Suponga la siguiente secuencia en preorden: A B C D E F G H I y la secuencia en inorden: B C A E D G H F I, se puede construir el rbol binario haciendo que la primera letra en a preorden sea la ra y al consider la denicin en inorden de que todos los antecesores de A z o sean los hijos izquierdo y los restantes en el lado derecho. Eso nos queda:

A B,C D,E,F,G,H,I

Movindose a continuacin de la secuencia en preorden est B como la prxima ra y por la e o a o z secuencia en inorden se tiene que B no tiene hijo izquierdo y un subrbol derecho con C. a

A B C D,E,F,G,H,I

Continuando de esta manera, se llega a:

A B C G H
Se puede decir que cada rbol binario tiene un unico par de secuencias pre-orden-inorden. a 2. Contando rboles binarios. a Para 0 o 1 nodo , se tiene 1 posible rbol binario. a 64

D E F J

Para 2 nodos, se tiene 2 posibles rboles binarios. a Para 3 nodos, se tienen 5.. Para n? Si los nodos de un rbol son enumerados en una secuencia de preorden de 1 . . . n, entona ces por el ejercicio anterior, distintos rbol binarios denen distintas secuencias en inorden a (permutaciones en inorden). Usando el concepto de permutacin en inorden, es posible mostrar que el nmero total de o u distintas permutaciones pasando los 1 . . . n nodes a travs de una pila y borrndolas en todas e a las formas posibles es igual al nmero total de rboles binarios con n nodos. u a Comenzemos con 3 nodos (1 . . . 3), las posibles secuencias son: 1,2,3;3,2,1;2,1,3;2,3,1;3,2,1 Cada una de estas permutaciones corresponde a uno de los 5 rboles posibles: a
1 2 3 3 1 2 2 3 3 3 1 2 2 1

En forma ms general, queremos una expresin bn de los nmeros de rboles binarios distintos a o u a con n nodos. Se puede deducir que bn es la suma de todos los posibles rboles binarios de la a siguiente forma, una ra y dos subrboles bi , bni1 : z

bn =
0in1

bi bni1 , n 1 b0 = 1

Con recurrencia

B(x) =
i0

bi xi

con

B(0) = b0 = 1 1 1 4x B(x) = 2x Por teorema binomial 1/2 m+1 65

B(x) =
m0

(1)m 22m+1 xm

Comparando las ecuaciones anteriores, bn es el coeciente de xn en B(x): bn ) = 1 n+1 2n n 4n bn = O( 3/2 ) n

3. Extensin de la denicin algebraica de un rbol binario. Dena las funciones: o o a P REORDER(btree) queue IN ORDER(btree) queue P OST ORDER(btree) queue Dena, adems, una funcin que realice el SW AP BT REE(btree) btree que invierte los a o hijos izquierdos y derechos en forma recursiva y la funcin que entrega el nmero de nodos o u hojas de un btree N U M LEAV ES(btree) int. usando la denicin AP P EN D(queue, queue) queue o

P REORDER(CREAT E) ::= EM P T Y QU EU E P REORDER(M AKEBT (l, d, r)) ::= AP P EN D(AP P EN D(ADDQ(EM P T Y QU EU E, d), (P REORDER(l))), (P REORDER(r))) IN ORDER(CREAT E) ::= EM P T Y QU EU E IN ORDER(M AKEBT (l, d, r)) ::= AP P EN D(AP P EN D((IN ORDER(l)), ADDQ(EM P T Y QU EU E, d)), (IN ORDER(l))) P OST ORDER(CREAT E) ::= EM P T Y QU EU E P OST ORDER(M AKEBT (l, d, r)) ::= AP P EN D(AP P EN D((P OST ORDER(l)), (P OST ORDER(l))), ADDQ(EM P T Y QU EU E, d))

SW AP BT REE(CREAT E) ::= CREAT E SW AP BT REE(M AKEBT (l, d, r)) ::= M AKEBT (SW AP BT REE(r), d, SW AP BT REE(l)) N U M LEAV ES(CREAT E) ::= 0 N U M LEAV ES(M AKEBT (l, d, r)) ::= if ISEM T BT (l) and ISEM T BT (r) then 1 else N U M LEAV ES(l) + N U M LEAV ES(r) 4. Arboles Completos: Un rbol con altura h es completo si tiene todos los niveles llenos hasta a el nivel h (ojo, se asume aqu que a la altura h, el nivel es h + 1) . El nivel h + 1 est lleno de a izquierda a derecha y a partir de un punto en adelante est vac Escriba un algoritmo que a o. indique si el rbol est o no lleno. a a 5. Arboles atados: Arboles atados son aquellos donde los nodos nulos de un rbol binario a tradicional son usados para asociar el nodo al nodo sucesor o antecesor en el recorrido del a rbol en un determinado orden (INORDER, POSTORDER, PREORDER). En la siguiente gura se muestra un rbol atado para un recorrido en inorder que apoya los algoritmos de a sucesor o predecesor. Algunos algoritmos para estos rboles son: a 66

punteros adicional punteros originales F

Figura 20: Arboles Atados

Encontrar el sucesor en inorder de un nodo N en un rbol atado. a Procedure SU CESSOR(var N odeN ) //Sea N el nodo en un rbol atado en inorder para el cual se desea encontrar el sucesor. a // N retornar el valor del sucesor a N := RLIN K(N ) if N es un puntero de atadura o N = nil then termina while LLIN K(N ) no sea un puntero de atadura do N := LCHILD(N ) endSU CESSOR Recorrer en inorder un rbo atado en inorder a Procedure W ALK(N odeR) //Sea R la ra del rbol atado z a N := R while LLIN K(N ) = nil do N := LCHILD(N ) Visite N N := SU CCESOR(N ) while N = nil do [ visite N N := SU CCESOR(N )] endW ALK Insertar un subrbol atado T1 como subrbol derecho de un nodo N en otro subrbol a a a atado T2 . Procedure IN SERT AR(var nodeN, nodeRT1 ) // RT1 es la ra de T1 z R := RT1 S := N repeat S := RCHILD(S) until S es una atadura o S = nil RLIN K(N ) := R Q := R while RLIN K(Q) no sea una atadura y RLIN K(Q) = nil do Q := RLIN K(Q) RLIN K(Q) := S Q := R while LLIN K(Q) no sea una atadura y LLIN K(Q) = nil do Q := LLIN K(Q) LLIN K(Q) := N endIN SERT AR 67

También podría gustarte