Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ деревья

Автор: -Екатерина- 19.05.2007 19:09

 
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;



ничего не выводит!! подскажите пожалуйста где ошибка!!

Автор: volvo 19.05.2007 19:17

Что за привычка давать куски кода? ВЫЗОВ процедур где? Ты можешь написать все идеально, но при неправильном вызове ничего не будет работать!

Добавлено через 2 мин.
Кстати, заполнение дерева неправильно реализовано... Это должна быть рекурсивная процедура, а у тебя рекурсивного вызова нет...

Автор: nikita182 19.05.2007 19:25

убери clrscr с процедуры obxod_OLP

ошибок много..

Автор: -Екатерина- 19.05.2007 19:26

вот вызовы процедур!


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;




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

Добавлено через 6 мин.
Цитата(nikita182 @ 19.05.2007 16:25) *


ошибок много..


описание вроде верно, создание пустого дерева тоже верно, вставка элемента вроде верно, сам обход правильный
или где не так??
подскажите где ошибки??

Автор: volvo 19.05.2007 19:41

Обязательно велосипед изобрести? Я вот тут уже ТАК все разжевал, что дальше некуда:
http://volvo71.narod.ru/faq_folder/bin_tree.htm

Автор: -Екатерина- 19.05.2007 19:56

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


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;