{Описать логическую функцию, проверяющую на равенство два заданных двоичных дерева}
program num4;
Type
Tinf = integer;
Ttree = ^TNode;
TNode = Record
info: Tinf;
left, right: Ttree;
End;
Var
s, s1: tinf;
root, root1: Ttree;
i,n, h1,h: integer;
{создание дерева}
procedure add_node (var root:TTree; el: Tinf);
var elem: TTree;
begin
if (root=NIL) then (* Если дерево пустое, то *)
begin
new(elem); (* Создать новый лист *)
elem^.left:=NIL;
elem^.right:=NIL;
elem^.info:=el; (* Записать туда значение требуемого элемента *)
root:=elem; (* Присоединить новый лист вместо пустого дерева *)
end
else (* Иначе *)
begin
if (el<root^.info) then (* Если добавляемое значение меньше текущего узла, то *)
add_node (root^.left, el) (* Добавить его в левое поддерево *)
else (* Иначе *)
add_node (root^.right, el); (* Добавить его в правое поддерево *)
end;
end;
{проверка на равенство деревьев}
function equal(p1, p2 : Ttree) : boolean;
begin
if (p1=nil) and (p2=nil) then equal := true
else
if (p1<>nil) and (p2<>nil)
then equal := (p1^.info= p2^.info) and equal(p1^.left, p2^.left)
and equal(p1^.right, p2^.right)
else equal := false
end;
(* Печать дерева *)
procedure print_tree (root: Ttree; h: integer);
const
n=40;
var i: integer;
begin
if root<>nil then
with root^ do
begin
print_tree (Left, h+2);
for i:=1 to n-h do
write(' ');
writeln (info);
print_tree (Right, h+2);
end;
end;
begin{main}
{ввод}
write ('Введите количество элементов в 1-ом дереве: ');
read (i);
n:=0;
repeat
write ('Введите элемент 1-го дерева: ');
readln (s);
add_node(Root, s);
n:=n+1;
until n=i;
write ('Введите количество элементов во 2-ом дереве: ');
read (i);
n:=0;
repeat
write ('Введите элемент 2-го дерева: ');
readln (s1);
add_node (Root1, s1);
n:=n+1;
until n=i;
{Сравнение}
if equal(root, root1)=true then
writeln('Деревья Равны')
else writeln('Деревья НЕ Равны');
readln;
{Печать}
writeln('Первое Дерево');
h:=0; h1:=0;
print_tree (root, h);
writeln('Второе Дерево');
print_tree (root1, h1);
readln;
End.
[Pascal] Дерево без рекурсии. Как?
Помогите переписать без рекурсии function equal или procedure print_tree...
1)создаёшь очередь
2)на каждом шаге удаляешь из неё первую вершину и добавляешь всех её потомков.
таким образом обходятся все вершины, что тебе и нужно.
P*t*, а можно поконкретнее, пожалуйста???
Значит нужно каким-то образом обойти все его вершины, не используя рекурсию.
Первое, что приходит в голову - стандартный обход в ширину.
Ещё можно моделировать рекурсию, используя стек.
Если нужно более подробно, то смотри сюда:
http://www.google.com/search?q=cache:Q0c4lkZEPfYJ:service.sch239.spb.ru:8001/infoteka/root/inform/room4/11-y%2520klass%2520(3%2520ili%25204%2520god%2520obucheniya)/Tema%25205.%2520Dinamicheskie%2520struktury/5.06%2520Urok%2520Obhod%2520dereva%2520v%2520shirinu.doc%3FPHPSESSID%3Dbd4bd59e98682f0adcfb8021096fdea9+%D0%BE%D0%B1%D1%85%D0%BE%D0%B4+%D0%B2+%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&hl=ru&ct=clnk&cd=3&gl=ru&client=firefox-a