Está en la página 1de 5

rboles balanceados Habamos visto que se puede demostrar por induccin que en un rbol completo el nmero de nodos totales

es (2 ** h+1) 1! "sto nos indica que las cosas que se hacen en rboles son de orden lo# n pero slo en el caso en que el rbol est$ lleno! "n el peor de los casos las cosas pueden ser lineales %(n)! &'mo poder #aranti(ar) entonces que se manten#a un balanceo* 'ada ve( que debido a una insercin o eliminacin el rbol se desbalancee) reubicar los nodos de modo que) manteniendo el invariante de un rbol de bsqueda binaria) se trate de mantener la altura del rbol! "+,

"l primer tipo de rboles balanceados -ue el ./0 (.delson /els1ii 0andis)! 2o son -recuentemente implementados) 3a que ha3 otros me+ores) pero las ideas que ha3 detrs de ellos se ven en los dems tipos de rboles balanceados! 4e trata de incluir otra condicin ms en el invariante de modo de ase#urar que la bsqueda sea %(lo# n), 0% ms simple sera requerir que para un rbol ./0 la altura de su subrbol derecho sea i#ual a la de su subrbil i(quierdo! 5ecordemos que los rboles se de-inen recursivanmete) por lo tanto esto se debera cumplir para cada nodo! "sto es sin embar#o mu3 restrictivo 3a que implicara que todo rbol ./0 debera ser completo adems! 0a de-inicin de rboles ./0 es entonces al#o ms rela+ada, 6e-, 7n rbol ./0 es un rbol binario con la propiedad adicional que para cualquier nodo "n el rbol la altura de su subrbol i(quierdo 3 de su subrbol derecho di-ieren a lo ms en 1!

"sta condicin ase#ura que el rbol slo tendr altura lo#artmica! 8ara probar esto necesitamos mostrar que un rbol de altura H tiene por lo menos '**H nodos para al#una constante H91! "n otras palabras) si el mnimo nmero de nodos en un rbol es e:ponencial a su altura) entonces la m:ima altura de un rbol con 2 elementos es dada por 0o# en base ' de 2! "sto se puede probar con los nmeros de ;ibonacci, 4ea 4(H) un rbol ./0 con altura H 3 con el mnimo de elementos para esa altura! "ntonces 4(<) = 1 3 4(1) = 2! .hora) por la condicin de un rbol ./0 sabemos que un rbol ./0 mnimo de altura H tiene como hi+os uno mnimo de altura H>1 3 otro mnimo de altura H>2) 3a que el desbalanceo puede ser a lo ms de 1! 6el dibu+o podemos ver que la cantidad de nodos de este rbol es 4(H) = 4(H>1) + 4(H>2) + 1! .hora los nmeros de ;ibonacci eran ;(2) = ;(2>1)+;(2>2) con ;(<) = 1 3 ;(1) = 1! 'orri#iendo, 4(H) = ;(H+?)! .hora) se sabe que el -ibonacci de un nmero i es alrededor de (@**i)Asqrt(B) con @ alrededor de 1!C1D (o sea 9 1)! 'onsecuentemente un rbol ./0 de altura H tiene a lo menos (#ruesamente estimando) @**(H+?)Asqrt(B)) por lo cual la altura para un rbol ./0 mnimo es lo#artmica con respecto al nmero de nodos! "sto implica que las operaciones sobre un rbol ./0 estn acotadas lo#aritmicamente!

8ero esto no se lo#ra #ratis) el costo es la complicacin de las operaciones insertar 3 eliminar 3a que estas son las que pueden desbalancear un rbol! 7na observacin clave es que es que despu$s de una insercin slo los nodos que estaban en el recorrido desde la ra( hasta el lu#ar de insercin pueden resultar desblanceados! .l volver recursivamente hacia la ra( despu$s de haber insertado o eliminado un nodo es posible encontrar nodos cu3o nuevo balance viole el principio de rbol ./0! 8ara hacer ms -cil este control) los nodos de un rbol ./0 adems de tener la in-ormacin normal (el elemento) tiene adems un nmero de balanceo que es la di-erencia de alturas entre el rbol i(quierdo 3 el rbol derecho (altura(i(q) atura(der))! /eamos los casos de insercin que pueden desbalancear un rbol ./0! 7n nodo E podria necesitar ser rebalanceado si se inserta un nuevo nodo, 1> 2> ?> F> 'aso 1 en el subrbol i(quierdo del hi+o i(quierdo de E en el subrbol derecho de hi+o i(quierdo en el subrbol i(quierdo del hi+o derecho en el subrbol derecho del hi+o derecho 'aso F '%G% "4H2 0%4 I26I'.6%5"4 6" J.0.2'" *

'aso 2

'aso ?

'%G% "4H2 0%4 I26I'.6%5"4 6" J.0.2'" *

"n el caso 1 3 F se habla de un nodo e:terno causando el desbalanceo! "n el caso 2 3 ? de uno interno!

8ara resolver el caso 1 3 F de los nodos e:ternos se hace lo que se llama rotacin simple (e+ pa# B1?)!

4tatic 2odo.rbol rotHi+oI(q(2odo.rbol p) K 2odo.rbol q = p!i(qL p!i(q = q!derL q!der = pL p!bal = <L q!bal = <L return qL M

4tatic 2odo.rbol rotHi+o6er(2odo.rbol p) K 2odo.rbol q = p!derL p!der = q!i(qL q!i(q = pL p!bal = <L q!bal = <L return qL M

8ara los casos 2 3 ? de los nodos internos se hace la llamada rotacin doble (e+ pa# B1B) 8 N 5 . J ' 6 . J ' 6 N 5 8

4tatic 2odo.rbol doble'onI(q(2odo.rbol p) K 2odo.rbol q = p!i(q) r = q!derL q!der = r!i(qL p!i(q = r!derL r!i(q = qL r!der = pL i- (r!bal 9 <) K AA J era mas alto que ' q!bal = <L r!bal = 1L p!bal = >1L M M Insercin en ./0! 0a manera ms simple es un al#oritmo recursivo, 8ara insertar un elemento E hacemos un al#oritmo recursivo (como el conocido para binarios) que inserta en el lu#ar preciso! "l subrbol -ormado por el nodo reci$n creado es 1ms alto que el anti#uo as que debe in-ormar de esto a su padre para que recalcule el -actor de balance! 4i al calcularlo el padre ve que se mantiene el balance) est todo en orden pero debe in-ormar a su padre que creci en uno para que este recalcule tambi$n! 4i en al#n momento se ve un desbalance que no se puede tolerar se reali(a la rotacin necesaria! 6esde ese momento no es necesario in-ormar de crecimiento de rbol hacia arriba 3a que se volvi la altura ori#inal!

.5J%0"4 5%O%>2"P5% Hienen la #racia de que se puede balancear mientras se va hacia aba+o (no se necesita el paso de vuelta hacia arriba por lo cual no se necesita hacerlo en -orma recursiva)! 'omo resultado la implementacin es ms simple 3 rpida que el ./0! 0os ro+o>ne#ro tienen las si#uientes caractersticas, 1> 2> ?> F> 'ada nodo est coloreado ro+o o ne#ro 0a ra( es ne#ra 4i un nodo es ro+o) los hi+os deben ser ne#ros (no se permiten dos ro+os se#uidos en un path) 'ualquier path desde la ra( hasta una re-erencia null debe contener el mismo nmero de nodos ne#ros

/er e+emplo en p# B1Q! 4e puede demostrar por induccin que si todo path desde la ra( hasta una re-erencia null tiene J nodos ne#ros) entonces tiene que haber por lo menos (2**J)>1 nodos ne#ros en el rbol! Gs an) como la ra( es ne#ra 3 no pueden haber dos nodos consecutivos ro+os en el path) la altura de un rbol ro+o>ne#ro es a lo ms 2*lo#(2+1) (intercalemos un nodo ro+o en al#uno de los path cada nodo ne#ro)! 'onsecuentemente) la bsqueda est #aranti(ada de ser lo#artmica! Insercin) primera apro:imacin, botton up 5ecordemos que todo nodo nuevo se inserta como una ho+a en un rbol! 4i la coloreamos ne#ra entonces de se#uro estaremos violando la propiedad F 3a que habr un path a una re-erencia null con un nodo ne#ra ms (en realidad 2)! Insertemos la ho+a nueva de color ro+o! 4i el padre era ne#ro est todo bien 3 hasta aqu lle#a el problema! 4i el padre 3a era ro+o entonces estamos en problemas) pero con rotaciones 3 cambios de colores es posible solucionar esto! Ha3 varios casos a considerar (3 sus espe+os) si el padre era ro+o, 8rimero consideremos que el tio era ne#ro o null! 4i llamamos x al nuevo nodo) p al padre) a al abuelo 3 t al tio podemos hacer una rotacin 3 un cambio de colores que nos de+ar todo en orden de nuevo! 4lo p 3 x pueden ser ro+os en este caso porque si a -uera ro+o hubiese una situacin no vlida .2H"4 de insertar! .hora podemos usar la terminolo#a de los rboles ./0 3 decir que el nodo nuevo x puede ser e:terno o interno! 4i es e:terno una rotacin simple 3 un cambio de color de p 3 de a arre#lan la cosa, a p : . ' 6 t : E E E E E E E E E E " . J J 6 " ' a t E E E E E E E E E E : t : J E E E E E E E E E E . p J ' 6 a E E E E E E E E E E " t p

.unque : es una ho+a 3 en ese caso t es null) hemos dibu+ado un caso ms #eneral para usar esto ms adelante! 8ara el caso de una insercin como nodo interno, rotacin doble! a p .

'

.ntes de continuar tenemos que estar se#uros que esto -unciona tambi$n para el caso #eneral (en que E no es ho+a)! 8rimero podemos ver que se mantienen las condiciones de ro+o>ne#ro intercalados 3 tambi$n la de los nodos ne#ros en los paths 3a que se conservo la cantidad de nodos ne#ros (dos a la derecha) 1 a la i(quierda)! Hambi$n se puede ver que las races de .)J)' 3 6 deberan haber sido ori#inalmente ne#ras (o null) si todo estaba en orden antes de aparecer E! %@) hasta aqu) pero &qu$ pasa si el to era ro+o* Jueno) se ve que esto tambi$n se puede arre#lar, a p : . ' 6 t : E E E E E E E E E E " . J J 6 a p . : J t E E E E E E E E E E . p J ' 6 : a E E E E E E E E E E " t " ' a t E E E E E E E E E E E p

'

.unque todo esto parece -uncionar queda una pre#unta, &qu$ pasa si el padre de a era ori#inalmente ro+o* Jueno) aqu podemos hacer los mismos anlisis que hemos hecho hasta ahora! "sta ve( s que tiene sentido tener en cuenta lo del caso #eneral) o sea que estamos tratando con nodos internos! Insercin top>doRn en rboles ro+o>ne#ro 8ara evitar la necesidad de tener que estar rotando el rbol cuando se va3a hacia arriba de vuelta de haber hecho una insercin podemos usar un truco cuando va3amos hacia aba+o de modo de ase#urar que cuando se lle#a al lu#ar que se debe insertar) el to nunca ser ro+o por lo cual bastar con insertar una ho+a ro+a 3 hacer a lo ms una rotacin (simple o doble)! "l procedimiento se basa en lo si#uiente, mientras se va hacia aba+o) si vemos un nodo : que tiene dos hi+os ro+os cambiamos : a ro+o 3 hacemos los hi+os ne#ros! E

"s claro que el nmero de nodos ne#ros ba+o : permanece inalterado! "l problema es que si el padre de : era ro+o tenemos dos ro+os consecutivos! "n teste caso podemos aplicar las rotaciones simple o doble vistas anteriormente) en las cuales haba un to ne#ro) dependiendo de dnde se encuentra : (estas no suben un nodo ro+o as que no par ms)! 8ero qu$ pasa si el to es ro+o S ah si se pasa un nodo ro+o hacia arriba S! "sto no puede pasar 3a que en el via+e hacia aba+o si se encontr que el abuelo tena dos hi+os ro+os se cambiaron a ne#ros! "+emplo, cuadros 1D!?F (p# B1Q) se quiere poner el FBcuando ba+amos vemos que el B< tiene dos hi+os ro+os! "sto se cambia (ver cuadro 1D!?T en p#! B2<)! "sto produce que el C< 3 el B< queden sucesivamente ro+os! 4e hace una rotacin simple (ver cuadro 1D!F< en pa#ina del lado) 3 lue#o se puede poner el FB sin problemas!

También podría gustarte