вантуз
15.04.2008, 17:30
итак суть проблемы вот в чем : Описать логическую функцию same(T)t определяющего, есть ли в дереве Т хотя бы два одинаковых элемента.
саму программу по созданию дерева и его просмотре я написал а вот как написать эту функцию уже 3й час понять не могу .вот текст программы написанной мною :
program zada4a;
type link = ^element;
element = record
data : integer;
left : link;
right : link;
end;
var
m,x, depth, minim : integer;
pn : link;
procedure add(var n : link; arg:integer);
var
ind, neo : link;
begin
new(neo);
neo^.data:=arg;
neo^.left:=nil;
neo^.right:=nil;
if n=nil then n:= neo
else begin
ind:=n;
while neo<>nil do begin
if arg<ind^.data then begin
if ind^.left=nil then begin
ind^.left:=neo;
neo:=nil
end
else ind:=ind^.left
end
else
if arg>ind^.data then begin
if ind^.right=nil then begin
ind^.right:=neo;
neo:=nil
end
else ind:=ind^.right
end
else begin
if arg=ind^.data then begin
if ind^.left=nil then begin
ind^.left:=neo;
neo:=nil
end
else
neo:=nil;
end;
end;
end;
end;
end; { add }
procedure restruct(var d : link);
var
ind1, ind2 : link;
begin
ind1:=d;
if ind1^.right=nil then begin
ind2:=d;
d:=ind2^.left;
dispose(ind2)
end
else
if ind1^.left=nil then begin
ind2:=d;
d:=ind2^.right;
dispose(ind2)
end
else begin
ind2:=ind1^.left;
while ind2^.right<>nil do begin
ind1:=ind2;
ind2:=ind2^.right;
end;
ind1^.right:=ind2^.left;
ind2^.left:=d^.left;
ind2^.right:=d^.right;
dispose(d);
d:=ind2;
end;
end; { restruct }
procedure view( n : link; var d:integer);
var
i : integer;
begin
for i:=1 to d do begin
write(' ') end;
writeln(n^.data);
if (n^.left=nil) and (n^.right=nil) then d:=d-1
else begin
if n^.right<>nil then begin
d:=d+1;
view(n^.right,d);
end;
if n^.left<>nil then begin
d:=d+1;
view(n^.left, d);
end;
d:=d-1;
end;
end; { view }
begin
m:=1;
pn:=nil;
while m<>0 do begin
writeln;
writeln('--- Type "1" to ADD new element');
writeln('--- Type "2" to VIEW tree');
writeln('--- Type "3" to FIND same elements');
writeln('--- Type "0" to EXIT program');
writeln;
write('Enter : ');
readln(m);
writeln;
case m of
1 : begin
write('Enter new element : ');
readln(x);
add(pn, x);
end;
2 : begin
depth:=1;
if pn=nil then writeln('The tree is empty') else begin
writeln('The tree is : ');
view(pn, depth);
end;
end;
3 : begin
end;
end; { case }
end;
end.
прошу спасти от мучений:молись::help:
добавлено через 2 минуты
и вот втораябтут я уж вобще ничего не понимаю 17.12.Формулу вида:
<формула>::=<терминал> |
(<формула><знак><формула>)
<знак>::=+|—|*
<тернинал>::=0|1 |2|3|4 |5 | 6|7|8 |9
можно представить в виде двоичного дерева («дерева-формулы») с ТЭД=char согласно следующим правилам:формула из одного терминала (цифры) представляется; деревом из одной вершины с этим терминалом, а формула вида:
*тут были картинки*
(f1 s f2)—деревом, в котором корень—это знак s, а левое и правое поддеревья — это соответствующие представления формул , f1 и f2. (На рис. 20 показано дерево-формула, соответствующее формуле (5*(3+8)).)
Описать рекурсивную функцию или процедуру, которая:
a) вычисляет (как целое число) значение дерева-формулы Т;
б) по формуле из текстового файла f строит соответствующее дерево-формулу Т;
b) печатает дерево-формулу Т в виде соответствующей формулы;
г) проверяет, является ли двоичное дерево Т деревом- формулой..
добавлено через 1 минуту
ой чтото со вторым сообщением казус прошу удалить))
саму программу по созданию дерева и его просмотре я написал а вот как написать эту функцию уже 3й час понять не могу .вот текст программы написанной мною :
program zada4a;
type link = ^element;
element = record
data : integer;
left : link;
right : link;
end;
var
m,x, depth, minim : integer;
pn : link;
procedure add(var n : link; arg:integer);
var
ind, neo : link;
begin
new(neo);
neo^.data:=arg;
neo^.left:=nil;
neo^.right:=nil;
if n=nil then n:= neo
else begin
ind:=n;
while neo<>nil do begin
if arg<ind^.data then begin
if ind^.left=nil then begin
ind^.left:=neo;
neo:=nil
end
else ind:=ind^.left
end
else
if arg>ind^.data then begin
if ind^.right=nil then begin
ind^.right:=neo;
neo:=nil
end
else ind:=ind^.right
end
else begin
if arg=ind^.data then begin
if ind^.left=nil then begin
ind^.left:=neo;
neo:=nil
end
else
neo:=nil;
end;
end;
end;
end;
end; { add }
procedure restruct(var d : link);
var
ind1, ind2 : link;
begin
ind1:=d;
if ind1^.right=nil then begin
ind2:=d;
d:=ind2^.left;
dispose(ind2)
end
else
if ind1^.left=nil then begin
ind2:=d;
d:=ind2^.right;
dispose(ind2)
end
else begin
ind2:=ind1^.left;
while ind2^.right<>nil do begin
ind1:=ind2;
ind2:=ind2^.right;
end;
ind1^.right:=ind2^.left;
ind2^.left:=d^.left;
ind2^.right:=d^.right;
dispose(d);
d:=ind2;
end;
end; { restruct }
procedure view( n : link; var d:integer);
var
i : integer;
begin
for i:=1 to d do begin
write(' ') end;
writeln(n^.data);
if (n^.left=nil) and (n^.right=nil) then d:=d-1
else begin
if n^.right<>nil then begin
d:=d+1;
view(n^.right,d);
end;
if n^.left<>nil then begin
d:=d+1;
view(n^.left, d);
end;
d:=d-1;
end;
end; { view }
begin
m:=1;
pn:=nil;
while m<>0 do begin
writeln;
writeln('--- Type "1" to ADD new element');
writeln('--- Type "2" to VIEW tree');
writeln('--- Type "3" to FIND same elements');
writeln('--- Type "0" to EXIT program');
writeln;
write('Enter : ');
readln(m);
writeln;
case m of
1 : begin
write('Enter new element : ');
readln(x);
add(pn, x);
end;
2 : begin
depth:=1;
if pn=nil then writeln('The tree is empty') else begin
writeln('The tree is : ');
view(pn, depth);
end;
end;
3 : begin
end;
end; { case }
end;
end.
прошу спасти от мучений:молись::help:
добавлено через 2 минуты
и вот втораябтут я уж вобще ничего не понимаю 17.12.Формулу вида:
<формула>::=<терминал> |
(<формула><знак><формула>)
<знак>::=+|—|*
<тернинал>::=0|1 |2|3|4 |5 | 6|7|8 |9
можно представить в виде двоичного дерева («дерева-формулы») с ТЭД=char согласно следующим правилам:формула из одного терминала (цифры) представляется; деревом из одной вершины с этим терминалом, а формула вида:
*тут были картинки*
(f1 s f2)—деревом, в котором корень—это знак s, а левое и правое поддеревья — это соответствующие представления формул , f1 и f2. (На рис. 20 показано дерево-формула, соответствующее формуле (5*(3+8)).)
Описать рекурсивную функцию или процедуру, которая:
a) вычисляет (как целое число) значение дерева-формулы Т;
б) по формуле из текстового файла f строит соответствующее дерево-формулу Т;
b) печатает дерево-формулу Т в виде соответствующей формулы;
г) проверяет, является ли двоичное дерево Т деревом- формулой..
добавлено через 1 минуту
ой чтото со вторым сообщением казус прошу удалить))