TYPE
ND = ^ NODE;
NODE = RECORD
INF1 : INTEGER;
INF2 : STRING ;
LEFT : ND;
RIGHT : ND;
END;
VAR
ROOT,P,Q,T : ND;
ans: string
procedure create_root (var root:nd);
begin
clrscr;
root:=nil;
writeln ('koren dereva sozdan');
READLN;
END;
PROCEDURE INSERT_EL (P:ND; {адрес включаемого элемента} VAR ROOT:ND);
BEGIN
IF ROOT = NIL
THEN ROOT:= P {элемент стал корнем}
ELSE BEGIN { поиск по дереву }
T := ROOT;
Q := ROOT;
WHILE ( T <> NIL ) DO
BEGIN
IF P^.INF1 < T^.INF1
THEN BEGIN
Q := T;
{ запоминание текущего адреса}
T := T^.LEFT; {уход по левой ветви}
END
ELSE IF P^.INF1 > T^.INF1
THEN BEGIN
Q := T;
{ запоминание текущего адреса}
T := T^.RIGHT;
{уход по правой ветви}
END
ELSE BEGIN
WRITELN ('найден дубль включаемого элемента');
READLN;
EXIT; {завершение работы процедуры}
END
END;
end;
{после выхода из цикла в q - адрес элемента,
к которому должен быть подключен новый элемент}
IF P^.INF1 < Q^.INF1
THEN Q^.LEFT := P {подключение слева }
ELSE Q^.RIGHT := P; {подключение справа}
END;
procedure creat_tree (q: nd; VAR ROOT:ND); {v dialoge}
begin
root:=nil;
ans:='y';
while ans='y' do
begin
new(q);
WRITELN ('vvedite znachenie pervogo inf. polya ');
READLN ( Q^.INF1 );
WRITELN ('vvedite znachenie vtorogo inf. polya ');
READLN ( Q^.INF2 );
INSERT_EL(q,root);
root:=q;
writeln ('ewe yzel?? y-da');
readln (ans);
end;
end;
PROCEDURE obxod_OLP ( Q : ND ); {pryamoi}
BEGIN
clrscr;
IF Q <> NIL
THEN BEGIN
writeln (q^.inf1,'______________',q^.inf2);
obxod_OLP( Q^.LEFT );{уход по левой ветви-Л}
obxod_OLP( Q^.RIGHT );{уход по правой ветви-П}
END
else writeln ('derevo pystoe');
END;
Что за привычка давать куски кода? ВЫЗОВ процедур где? Ты можешь написать все идеально, но при неправильном вызове ничего не будет работать!
Добавлено через 2 мин.
Кстати, заполнение дерева неправильно реализовано... Это должна быть рекурсивная процедура, а у тебя рекурсивного вызова нет...
убери clrscr с процедуры obxod_OLP
ошибок много..
вот вызовы процедур!
procedure pr2_tree;
var fl4: boolean;
s: integer;
begin
fl4:=true;
while fl4=true do
begin
ved_tree(s);
case s of
1: create_root (root);
4: creat_tree(q,root);
5: begin
Q:= ROOT;
obxod_OLP(q);
end;
end;
end;
end;
Обязательно велосипед изобрести? Я вот тут уже ТАК все разжевал, что дальше некуда:
http://volvo71.narod.ru/faq_folder/bin_tree.htm
я все это видела!
можно тогда так переделать?? это правильно будет???
procedure Insert(var Root: TTree; X: T);
procedure CreateNode(var p: TTree; n: T);
begin
New(p);
WRITELN ('vvedite znachenie pervogo inf. polya ');
READLN ( p^.INF1 );
WRITELN ('vvedite znachenie vtorogo inf. polya ');
READLN ( p^.INF2 );
p^.Left := nil;
p^.Right := nil
end;
begin
if Root = nil Then CreateNode(Root, X) { создаем новый узел дерева }
else
if p^.inf1 < X then Insert(Right, X)
else
if p^.inf1 > X Then Insert(Left, X)
else writeln ('DUBL')!!!
end;