Soluciones a los problemas de dificultad ascendente 2 Soluciones a los problemas de dificultad ascendente 2 . IM P R E S IÓ N D E L A S C L A V E S D E U N Á R B O L B D E M E N O R A M A Y O R . P ro ced u re Im p rim ir ( A : tA rb o lB ); (* V er d eclaració n d el tip o ‘tA rb o lB ’ en el en u n ciad o d el p ro b lem a * ) v a r i: In teg er; b eg in if A < > n il th en (* C o n d ició n d e fin d el b lo q u e recu rsiv o * ) b eg in (* Im p resió n d el su b árb o l izq u ierd o d e u n a p ág in a* ) Im p rim ir ( A ^.D escen [0 ] ); (* y d el resto d e la p ág in a * ) fo r i := 1 to A ^.N u m C lav es d o b eg in (* P rim ero se im p rim e el n o d o raíz * ) w rite( A ^ .C lav es [i] ); (* y d esp u és el su b árb o l d erech o d e ese n o d o * ) Im p rim ir ( A * .D escen [i] ) en d en d en d ; L lam ad a: Im p rim ir ( A rb o l ); 3 Soluciones a los problemas de dificultad ascendente 4 Soluciones a los problemas de dificultad ascendente 3. S U B Á R B O L C O N M A Y O R N Ú M E R O D E C L A V E S . F u n ction m ayor ( A : T A rbolB ): T A rbolB ; (* D evuelve un puntero al subárbol del árbol-B ‘A ’ con m ayor núm ero de nodos *) F u n ction C ontar ( A : T A rbolB ): In teger; (* C uenta el núm ero de nodos en el árbol-B apuntado por ‘A ’ *) var i, sum a: In teger; b egin sum a := 0; if A = nil th en C ontar := 0 (* U n árbol vacío no tiene ninguna clave *) else b egin (* N º de nodos de la página activa *) sum a := sum a + A ^.N um C laves; (* … y de sus sucesores *) for i := 0 to A ^.N um C laves d o sum a := sum a + C ontar( A ^.D escen[ i ] ); (* E l valor buscado está en ‘sum a’ *) C ontar := sum a en d en d ; (* C ontar *) var i, sum a, aux: In teger; salida: T A rbolB ; b egin (* M ayor *) sum a := 0; aux := 0; salida := nil; if A < > n il th en b egin (* C álculo del N º de claves de todos los subárboles *) for i := 0 to A ^.N um C laves d o b egin sum a := C ontar ( A ^.D escen[ i ] ); (* S i se encuentra un N º de claves m ayor, se guarda *) if sum a > aux th en b egin aux := sum a; salida := A ^.D escen[ i ]; en d en d en d ; (* E l valor pedido está en ´salida´) M ayor := salida en d ; (* M ayor *) llam ada: M asC laves := M ayor ( A ); ( var M asC laves: T A rbolB ; ) 5 Soluciones a los problemas de dificultad ascendente 4 . ¿S E T R A T A D E U N Á R B O L -B ? F u n ctio n E S B ( A : T arb o l; N _ A , v a r N _ P _ N ): B o o lea n ; (* C o m p ru eb a si el árb o l ‘A ’ cu m p le las características d e u n árb o l-B * ) (* N _ A : n iv el actu al, *) (* N _ P _ N : n iv el p rim er n il; n iv el d el p rim er p u n tero a ‘n il’ *) v a r O k : B o o lea n i: In teg er; b eg in if A = n il th en if N _ P _ N = 0 th en (* se lleg a al fin al d el árb o l y el v alo r d e N _ P _ N n o h a cam b iad o * ) b eg in N _ P _ N := N _ A ; O k := tru e en d else if N _ P _ N = N _ A (* se lleg a al fin al d el árb o l y el p rim er n il se en cu en tra en ese n iv el * ) th en O k := tru e else O k := fa lse else b eg in O k := tru e; i := 0 ; (* to d as las p ág in as m en o s la p rim era tien en en tre N y 2 N clav es * ) (* v er la d eclaració n d el cam p o N u m C lav es, d e tip o tP ag in a *) if ( A ^ .N u m C lav es < N ) a n d ( N _ A < > 1 ) th en O k := fa lse; (* b u cle d e llam ad as recu rsiv as *) else w h ile ( i < = A ^.N u m C lav es ) a n d O k d o b eg in O k := O k a n d E S B ( A ^. D escen [i], N _ A + 1 , N _ P _ N ); i := i + 1 ; en d en d ; E S B := O k en d ; L lam ad a: E S B ( A , 0 , 1 ); 6 Soluciones a los problemas de dificultad ascendente 5. C L A V E S R E P E TID A S . F u n ction R epetidas ( A : T arbolB ; var C laveA nterior: T clave; var P rim eraV ez: B oolean ): B oolean; (* D etecta la existencia de claves repetidas en el interior de un árbol-B *) (* C laveA nterior: clave anterior; Prim eraV ez: prim era vez que se entra en el árbol *) var i: In teger; O k : B oolean ; b egin if A = n il th en O k := tru e else b egin i := 0; (* bajada por los sub-árboles izquierdos del árbol ‘A ’ *) O k := R epetidas (A ^.D escen[ 0 ], C laveA nterior, P rim eraV ez); (* bucle de búsqueda de claves repetidas *) w h ile i < = A ^ .N um C laves an d O k d o b egin i := i+1; if P rim eraV ez th en b egin P rim eraV ez := false ; C laveA nterior := A ^.C laves [ i ] en d else if C laveA nterior = A ^.C laves [ i ] th en O k := tru e else C laveA nterior := A ^.C laves [ i ]; O k := O k an d repetidas ( A ^.D escen [ i ], C laveA nterior, Prim eraV ez) en d en d ; R epetidas := O k en d ; L lam ada: R ep etid as( A , ‘indiferente’ , tru e ); 7 Soluciones a los problemas de dificultad ascendente 6. ¿A 1 IN C L U ID O D E N T R O D E A 2? F u n ction C ontenida ( A , B : T arbolB ): B oolean ; E ste problem a es de considerable var O k: B oolean ; dificultad. S e m uestra a i: In teger; continuación una posible solución. b egin if B = nil th en C ontenida := tru e else if A = n il th en C ontenida := false else b egin i := 1; O k := tru e; w h ile ( i < = A ^.N um C laves ) and O k do (* avanza por la página de ‘A ’*) if A ^.claves [ i ] < B ^.claves [ i ] th en i := i + 1; (* encuentra la raíz de B *) else if A ^.claves[ i ] = B ^.claves[ i ] th en i := D osN + 2 (* el nodo de ‘A ’ no está en la página de ‘B ’ *) else O k := false; if i = D osN + 1 th en C ontenida := C om parar ( A , B ) else C ontenida := C ontenida ( A ^.D escen[ i - 1 ], B ) en d ; end; F u n ction C om parar ( A , B : T A rbolB ): B oolean ; var O k: B oolean ; i, j, E m piezaI: In teger; b egin (* 1 *) if B = n il th en C om parar := tru e else b egin (* 2 *) i := 1; O k := false; w h ile ( i < = A ^.N um C laves ) an d n ot O k d o if A ^.claves[ i ] = B ^.claves[ i ] th en O k := tru e else i := i + 1; j := 1; w h ile ( i < = A ^.N um C laves) an d ( j < = B ^.N um C laves ) an d O k d o if A ^.claves[ i ] 0 B ^.claves[ i ] th en b egin j := j + 1; i := i + 1 en d else O k := false; O K := O k an d ( j > B ^.N um claves ) w h ile ( j < = B ^.N um claves) an d ( E m piezaI + j < = A ^.N um C laves ) an d O k d o O k := C om parar ( A ^.D escen[E m piezaI + j], B ^.D escen[ j ]; C om parar := O k en d (* 2 *) en d (* 1 *) 8 Soluciones a los problemas de dificultad ascendente 9