Господа профи посодействуйте, пожалуйста, в доработке задачи на сравнение деревьев.
Задача:
Описать 2 функции, которые соответственно определяют,
имеют или не имеют два построенных дерева одинаковые ключи и информационные элементы.
Проверку осуществлять при обходе деревьев, а не при построении.
Деревья и результаты сравнения вывести на экран
Вот мой исходник, пока не могу довести его до логического завершения.
Код:
program TREE;
{$APPTYPE CONSOLE}
uses
SysUtils ;
// Дерево 1
type TREE=^INF;
INF=record
KEY:integer;
INFORM:integer;
LEFT:TREE;
RIGHT:TREE;
end;
// Дерево 2
type TREE2=^INF2;
INF2=record
KEY2:integer;
INFORM2:integer;
LEFT2:TREE;
RIGHT2:TREE;
end;
//Создаём, заполняем, рекурентно ДЕРЕВО 1
//обращаемся с сортировкой вправо или влево
procedure ZAPOLN(R:integer; var Root:TREE);
begin
Randomize;
if Root=nil then
begin
New(Root);
Root^.KEY:=R;
Root^.INFORM:= Random(100);
Root^.LEFT:=nil;
Root^.RIGHT:=nil;
end
else if Root^.KEY > R then
ZAPOLN(R,Root^.LEFT)
else if Root^.KEY < R then
ZAPOLN(R,Root^.RIGHT)
end;
////////////////////////////////////////////////////////
//Создаём, заполняем, рекурентно ДЕРЕВО 2
//обращаемся с сортировкой вправо или влево
procedure ZAPOLN2(R2:integer; var Root2:TREE2);
begin
Randomize;
if Root2=nil then
begin
New(Root2);
Root2^.KEY2:=R2;
Root2^.INFORM2:= Random(100);
Root2^.LEFT2:=nil;
Root2^.RIGHT2:=nil;
end
else if Root2^.KEY2 > R2 then
ZAPOLN(R2,Root2^.LEFT2)
else if Root2^.KEY2 < R2 then
ZAPOLN(R2,Root2^.RIGHT2)
end;
// Распечатка Дерева 1
Procedure PRINT_TREE_NEW (L:integer; R:TREE);
var i:integer;
begin
if R<>nil then
begin
if ((R^.LEFT=nil) and (R^.RIGHT=nil)) then
begin
ZAPOLN(R^.KEY,R);
end;
PRINT_TREE_NEW(L+1,R^.RIGHT);
for I := 1 to L do
write (' ');
write (R^.key);
write (' --> ');
writeln (R^.INFORM);
writeln (' ');
PRINT_TREE_NEW(L+1,R^.left);
end;
end;
//////////////////////////////////////////////////////////////////////
////////////// Распечатка Дерева 2 //////////////////////
Procedure PRINT_TREE_NEW2 (L2:integer; R2:TREE2);
var i:integer;
begin
if R2<>nil then
begin
if ((R2^.LEFT2=nil) and (R2^.RIGHT2=nil)) then
begin
ZAPOLN2(R2^.KEY2,R2);
end;
PRINT_TREE_NEW(L2+1, R2^.RIGHT2);
for I := 1 to L2 do
write (' ');
write (R2^.key2);
write (' --> ');
writeln (R2^.INFORM2);
writeln (' ');
PRINT_TREE_NEW(L2+1,R2^.left2);
end;
end;
//////////////////////////////////////////////////////////////////////
// Функция, сравнивающая ключи
function TreeF_key(y:integer;p:TREE2):integer;
var r:integer;
begin
If p<>Nil
then begin
if y = p^.Key2 then
begin
Write (p^.Key2, ' FOUND ');
r:= p^.Key2 ;
end;
// Printtree_Left (p^.Left2);
// Printtree_Left (p^.Right2);
end;
end;
// Функция, сравнивающая информационную часть
function TreeF_inf(y:integer;p:TREE2):integer;
var r:integer;
begin
If p<>Nil
then begin
if y = p^.Key2 then
begin
Write (p^.Key2, ' FOUND ');
r:= p^.Key2 ;
end;
// Printtree_Left (p^.Left2);
// Printtree_Left (p^.Right2);
end;
end;
{Hисходящий обход бинаpного деpева}
PROCEDURE Printtree_Left (w: tree; g:tree2);
BEGIN
If w<>Nil
then begin
Writeln (w^.Key, ' [', w^.INFORM,'] ');
Printtree_Left (w^.Left,g);
Printtree_Left (w^.Right,g) ;
TreeF_key(w^.Key,g);
end ;
END;
///// Сама программа /////////////////////////////////
var
roo:TREE=nil;
roo2:TREE2=nil;
I,R:integer;
begin
Randomize;
I:=0;
while I<30 do
begin
R:=random(10);
ZAPOLN(R,roo);
I:=I+1;
end;
I:=0;
while I<=30 do
begin
R:=random(10);
ZAPOLN2(R,roo2);
I:=I+1;
end;
writeln('////////////////////////// Tree 1 ////////////////////////////////');
PRINT_TREE_NEW(0,Roo);
writeln('////////////////////////// Tree 2 ////////////////////////////////');
PRINT_TREE_NEW2(0,Roo2);
Printtree_Left (roo,roo2) ;
readln;
end.
Движение - жизнь. Остановка - ... ?