MODULE TreeVisual; IMPORT In, Line, Oberon; CONST timeout = 1000; TYPE Node* = POINTER TO NodeDesc; NodeDesc* = RECORD key: INTEGER; left,right:Node; END; Tree* = POINTER TO TreeDesc; TreeDesc = RECORD root: Node; END; PROCEDURE show*(T:Tree); (* Tree grafisch ausgeben *) CONST breadth=90; TYPE Point=RECORD; x,y: INTEGER; END; VAR last, root, act:Point;time:LONGINT; PROCEDURE Drawline(n:Node; level:INTEGER; from, to: Point); BEGIN IF n#NIL THEN Line.Line (from.x,from.y, to.x,to.y, (level MOD 2)*2+1,1); from:=to;to.x:=from.x-(breadth DIV (level));to.y:=from.y-50; Drawline(n^.left,level+1,from,to); to.x:=from.x+(breadth DIV (level));to.y:=from.y-50; Drawline(n^.right,level+1,from,to); END; END Drawline; BEGIN IF ~Line.Init(1024,768,10,720,630,40,320,380,1,1) THEN RETURN; END; Line.Clear(120, 180, 400, 400); root.x:=320; root.y:=550; Drawline(T^.root,1, root, root) END show; PROCEDURE insert(VAR n:Node; new:Node); BEGIN IF (n=NIL) THEN n:=new; ELSIF (n^.key>new^.key) THEN insert(n^.left,new); ELSE insert(n^.right,new); END; END insert; PROCEDURE test*(); VAR node:Node;key:INTEGER;t:Tree;time:LONGINT; BEGIN NEW(t); In.Open; In.Int(key); WHILE (In.Done) DO NEW(node); node^.key:=key; node^.right:=NIL; node^.left:=NIL; insert(t^.root,node); show(t); time:=Oberon.Time(); WHILE (Oberon.Time()