Arboles Beta

Anuncio
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
Descargar