viernes, 16 de diciembre de 2016

Programación del Sinclair QL (XX): Estructuras de datos. Presentar el árbol



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="">
 
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