La presentación de los datos que hacía del árbol no eran muy adecuadas, en las listas se ve mejor pero el árbol cuesta mas de ver presentando en forma lineal los valores de datos y enlaces, por lo que he desarrollado un proceso para ver de manera mas gráfica los árboles, en modo texto, pero queda bastante visible. Hay dos procesos, uno que presenta el árbol que es nuevo, y el que retorna la lista de elementos del árbol en una cadena que he simplificado la visualización.
4890 REMark -------------------------------------------------------------- 4900 REMark -- ARBOL_VER_GR -- Presenta en pantalla un arbol -- 4910 REMark -------------------------------------------------------------- 4920 DEFine PROCedure ARBOL_VER_GR 4930 LOCal lin,col,a$ 4940 : 4950 lin = ARBOL_NIVELES - 1 4960 col = 1 : FOR i=2 TO lin+2 : col = (2 * col) 4970 OPEN#5,con : WINDOW#5, 448,200,32,16 4980 CLS#5 : BORDER#5, 2,2 4990 PRINT#5, "N:";!ARBOL_NIVELES;!"L:";lin;!"C:";col-2, 5000 PRINT #5,ARBOL_ELEMENTOS$ 5010 montar 0,col/2-1,col/4,A_RAIZ 5020 INPUT a$ 5030 CLOSE#5 5040 END DEFine 5050 : 5060 DEFine PROCedure montar(l,c,s,nodo) 5070 LOCal i,t 5080 : 5090 IF nodo <> P_NULO THEN 5100 imprime l+1,c+1, ArrArbol(nodo) 5110 IF ArrDer(nodo) <> P_NULO THEN 5120 t = c+s+1 5130 FOR i=c+2 TO t-1 : imprime l+1,i,"-" 5140 imprime l+1, t, "\" 5150 imprime l+2, t, "|" 5160 END IF 5170 IF ArrIzq(nodo) <> P_NULO THEN 5180 t = c-s+1 5190 FOR i=c TO t+1 STEP -1 : imprime l+1,i,"-" 5200 imprime l+1, t, "/" 5210 imprime l+2, t, "|" 5220 END IF 5230 montar l+2,c-s,s/2,ArrIzq(nodo) 5240 montar l+2,c+s,s/2,ArrDer(nodo) 5250 END IF 5260 END DEFine 5270 : 5280 DEFine PROCedure imprime(l,c,dato$) 5290 IF (l > 0) AND (l < 19) AND (c > 0) AND (c < 73) THEN 5300 AT#5,l,c : PRINT#5, dato$ 5310 END IF 5320 END DEFine 5330 : 5340 REMark -------------------------------------------------------------- 5350 REMark -- v$ = ARBOL_ELEMENTOS$ -- Muestra la lista de elementos -- 5360 REMark -- RETORNA: Lista ordenada de elementos del arbol -- 5370 REMark -------------------------------------------------------------- 5380 DEFine FuNction ARBOL_ELEMENTOS$ 5390 LOCal lista$ 5400 : 5410 lista$="" 5420 inorden lista$,A_RAIZ 5430 RETurn lista$ 5440 END DEFine 5450 : 5460 DEFine PROCedure inorden(cadena$,nodo) 5470 IF nodo <> P_NULO THEN 5480 inorden cadena$, ArrIzq(nodo) 5490 IF LEN(cadena$) <> 0 THEN cadena$ = cadena$ & "," 5500 cadena$ = cadena$ & ArrArbol(nodo) 5510 inorden cadena$, ArrDer(nodo) 5520 END IF 5530 END DEFine<0 hay="" libres="" no=""> 0>El resultado es el siguiente, no es espectacular pero creo que se ve bien la estructura del árbol, y cuando entremos en los árboles AVL y las rotaciones se verá de forma mas clara como se van moviendo los datos.
Aquí los fuentes de todo lo desarrollado sobre estructuras de datos hasta el momento, la parte de ordenación no ha variado.
No hay comentarios:
Publicar un comentario