Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2010, 10:00   #1
kaizer131
Пользователь
 
Регистрация: 21.03.2009
Сообщений: 52
По умолчанию Сравнение деревьев

Господа профи посодействуйте, пожалуйста, в доработке задачи на сравнение деревьев.

Задача:

Описать 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.
Движение - жизнь. Остановка - ... ?
kaizer131 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
печать двоичных деревьев в Treeview Xe-Xe Помощь студентам 8 07.06.2010 20:35
C++ количество бинарных деревьев с n ( 1 n 1000) вершинами. fedia Помощь студентам 0 08.10.2009 18:14
Программы для постройки деревьев, графов. Armorer Софт 0 22.04.2009 10:10
компонент отображения деревьев IgorKr Компоненты Delphi 3 03.05.2008 09:01