![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Господа профи посодействуйте, пожалуйста, в доработке задачи на сравнение деревьев.
Задача: Описать 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. |