Показать сообщение отдельно
  #1  
Старый 25.05.2010, 09:18
kaizer131 kaizer131 вне форума
Начинающий
 
Регистрация: 01.11.2008
Сообщения: 112
Репутация: 10
Восклицание Ошибка в сравнении деревьев

Доброго времени суток.
Есть необходимость сравнить содержимое двух деревьев на совпадение ключей их звеньев (содержимое ключей задается случайным образом)

У меня возникает ошибка в функции, которая сравнивает ключи в двух деревьях.
(построение и вывод деревьев проводятся без ошибок)

Идентифицировать ошибку не могу так, как консоль попросту вылетает, где то в строках (по разному)

Код:
  else  If (tree2^.KEY < key)
     Then
     tree2 := tree2^.RIGHT; //  в правом поддереве
     If (tree2^.KEY = key) Then
     Result:= TRUE; // Возвратить найденное

Думаю что причина в неправильной работе с памятью, но могу ошибаться.

Сама функция TreeSearch, вызывается из процедуры Printtree_Left ниже приведён кусок кода, отвечающий за поиск и сравнение :
Код:
function TreeSearch(var tree2:TREE; key:integer) :boolean;
Begin
 result:=false;
 While  (result <> true)  and (tree2 <> NIL) Do
  Begin
    If (tree2^.KEY > key) Then
     tree2 := tree2^.LEFT //  искать в левом поддереве
     else  If (tree2^.KEY < key)
     Then
     tree2 := tree2^.RIGHT; //  в правом поддереве
     If (tree2^.KEY = key) Then
     Result:= TRUE; // Возвратить найденное
  End  ;
End  ;



{Hисходящий обход бинаpного деpева}
PROCEDURE  Printtree_Left (tree1: tree; tree2:tree);
BEGIN
If  tree1<>Nil
    then
    begin
       if TreeSearch( tree2, tree1^.KEY) = true then
       Writeln (tree1^.Key, ' Found');
       Writeln (tree1^.Key, '  [', tree1^.INFORM,']     ');
       Printtree_Left (tree1^.Left,tree2);
       Printtree_Left (tree1^.Right,tree2)  ;
     end ;
END;



var
tree1:TREE=nil;
tree2:TREE=nil;

begin

Printtree_Left (tree1,tree2);
readln;
end.

Буду благодарен за помощь или за ссылки на материалы по сравнению бинарных деревьев поиска ( Гугл ничего толкового не выдал )
Ответить с цитированием