мне надо создать и вывести дерево ОЛП в таблице
все создается, но не выводитс изза рекурсии

Type
ND = ^ NODE;
NODE = RECORD
INF1 : string;
INF2 : STRING ;
LEFT : ND;
RIGHT : ND;
END;
var
q,root:ND;

procedure obxod_OLP (q:nd); {prymoi}
var
npp:string;
begin
form7.stringgrid1.rowcount:=2;
form7.stringgrid1.ColCount:=3;
form7.stringgrid1.Cells[0,0]:='№ п\п';
form7.stringgrid1.Cells[0,0]:='Ключевой признак';
form7.stringgrid1.Cells[1,0]:='Информация';
if q <> nil
then begin
inc(k);
form7.stringgrid1.rowcount:= form7.stringgrid1.rowcount+1;
inc(k);
str(k,npp);
form7.stringgrid1.Cells[0,k]:=npp;
form7.stringgrid1.Cells[1,k]:= q^.inf1;
form7.stringgrid1.Cells[2,k]:=q^.inf2;
obxod_OLP( q^.LEFT );
obxod_OLP( q^.RIGHT );
end;
end;

получается что выводит только последний элемент
что и где изменить? или как сделать без рекурсии??!!

2) и вот еще подсчет количества узлов дерева:
PROCEDURE yzel_COUNT(root:ND; VAR K:INTEGER );
BEGIN
IF root<>NIL
THEN BEGIN
p:=root;
IF not(p^.LEFT=NIL) AND not(p^.RIGHT=NIL)
THEN K:=K+1;
yzel_COUNT(p^.LEFT,K );
yzel_COUNT(p^.RIGHT, K );
END;
end;

procedure TForm6.RadioButton1Click(Sender: TObject);
var s: string;
k: integer;
begin
k:=0;
yzel_count(root,k);
s:=' Количество узло = ' + inttostr(k);
if k=0
then showmessage ('Дерево пусто')
else showmessage (s);
end;


получается к=0 и выводит что дерево пусто
заранее спасибо