visualizar arbol binario en freepascal

Aziwar

Buenas! Me podeis poner un código que sirva para ver un árbol en forma de árbol en freepascal?

El profesor nos dijo que es jugando con una de las units del sistema y las posiciones de pantalla pero no se como.

                                        a
                         b                             c
                d               e              f               g

quiero q se vea asi en vez de

a
  b
      d
      e
   c
      f
      g
r2d2rigo

Si mal no recuerdo, para posicionar el cursor en Pascal se usaba gotoxy(x,y). De esta manera, el elemento raiz estara en la primera linea (y=1), los hijos en y=2, los nietos en y=3, etc; Y, para las columnas, tendras que usar el ancho de pantalla dividido entre el numero de elementos del nivel, mas uno: para el nodo raiz, x = ancho/2, para los hijos, x = ancho/3, etc.

Aziwar
procedure imprimir(arbol : TArbol; margen : integer);
var
	m : integer;
begin
	if not vacio(arbol) then
		with arbol^ do
		begin
			for m := 1 to margen do
				write('   ');
			writeln(dato);
			imprimir(izq,margen + 1);
			imprimir(der,margen + 1);
		end;
end;

Este es el procedimiento q tengo para que salga del 2º modo. Que modifico para realizarlo de ese modo?

m0rG

La unit es CRT,es bastante sencillita de utilizar :P.Te dejo un enlace a la documentación de FreePascal: http://www.freepascal.org/docs-html/rtl/crt/index.html

Aziwar

mmm tengo un problemilla xD

a veces no me muestra alguno pero creo que es porque coincide en la misma posición, pero he probado por ejemplo poniendo en uno -2 y en otro +3 y pasa =... a ver si le veis el fallo xD

procedure imprimir(arbol : TArbol; x,y : integer);
begin
	if not vacio(arbol) then
		with arbol^ do
		begin
			gotoxy(x,y);
			writeln(dato);
			imprimir(izq,x-3,y+1);
			imprimir(der,x+3,y+1);
		end;
end;

EDIT: quiero ver este árbol

                           1
               2                  3
       4             5     6            7

pero con ese procedimiento efectivamente pasa como mencioné, el 5 y el 6 están en la misma posición y solo muestra el 5

Puni

ignoro si pascal tiene recursividad, pero de tenerla te sera mucho mas facil recorriendo el arbol en postorden e imprimirlo de lado, es decir, la raiz a la izquierda y las hojas a la derecha

Aziwar

asi es como lo tengo y como no quiero que se vea, quiero que se vea de arriba a abajo

Puni

yo decia con forma de arbol de verdad, con la raiz entre los dos nodos hijo, pero de lado

Aziwar

si si asi lo tengo xD, cuando puse el primero post hay 1 linea q va antes q otra para q salga asi xD pero ya esta arreglado eso jeje

Usuarios habituales

  • Aziwar
  • Puni
  • m0rG
  • r2d2rigo