MacFiss
@MacFiss
человек

Как сбросить указатель вложенного двоичного дерева?

В общем, написал модуль для работы с двоичным деревом. В качестве значений у нас слова. Суть модуля, поиск слов в словаре. И так, проблема: если несколько раз вызвать функцию search со словом которое есть в словаре - находит все ок. После вводим несколько раз подряд неверные слова, и потом снова слово из словаря. Выдаст вместо True -> False.

Мне кажется что перезаписывается исходный указатель на родителя, с каждой рекурсивной итерацией _search. И в последующих ветвях просто нет искомого слова.

Вопрос: Как сохранить базовую переменную Dictionary? В смысле его указатель. Перезапись в другую переменную не помогает. Записывается в нее тот же адрес и все тут ;(

Использовать:
uses MrBinTree;

var binTree := new _binTree;
binTree.search('блаблабла');


unit MrBinTree;

interface
  uses General;
type
  PDictionary = ^_Dictionary; { Указатель на узел }
  _Dictionary = record { Тип где будем хранить информацию }
    data: string;
    left, right: PDictionary; { ссылки на дочерние левые и правые элементы }
  end;
  
  _binTree = class
  private
    Dictionary, {Адрес корня дерева}
    owner: PDictionary; {Владелец результата поиска}
    word: integer; {Искомое слово в символьном исполнении}
    
    procedure add(var Dictionary: PDictionary; word: string);
    procedure loadDictionary;
    function _search(var Dictionary: PDictionary; word: string) : PDictionary;
    procedure deleteTree(var Tree1: PDictionary );
  public
    constructor Create;
    function search(var word: string) : boolean;
  end;
implementation
  constructor _binTree.Create;
  begin;
    self.loadDictionary;
  end;

  procedure _binTree.deleteTree(var Tree1: PDictionary );
  begin
  if Tree1 <> nil then
    begin
      self.DeleteTree (Tree1^.LEFT);
      self.DeleteTree (Tree1^.RIGHT);
      Dispose(Tree1);
    end;
  end;
  
  procedure _binTree.loadDictionary;
  var
    i: integer;
    word: string;
  begin
    AssignFile(input, 'dictionary.txt'); {Откроем поток}
    Reset(input); { Откроем файл }
    while not EOF(input) do { Итерируем до того,пока не дойдем до конечной строки }
    begin
     ReadLn(input, word); { Читаем строку }
     self.add(self.Dictionary, word);
    end;
    CloseFile(input); { Закроем поток }
  end;

  {Добавление набора символов в дерево}
  procedure _binTree.add(var Dictionary: PDictionary; word: string);
  begin
    {Для начала проверим наличие корней в дереве, если нету,то создадим}
    if (Dictionary = nil) then
    begin
      New(Dictionary); {Выделим памяти}
      Dictionary^.data := word; {Добавим наши символы}
      Dictionary^.left := nil; {Обнулим указатели}
      Dictionary^.right:= nil; {Обнулим указатели}
      exit; {Готово, процедуру завершим}
    end;
    
    {Есть корни в дереве, проверим вводимые символы на размерность, если больше - правое, меньше - левое}
    if ( word < Dictionary^.data ) then
      self.add(Dictionary^.left, word) {если коды символов меньше корня,добавим с левое поддерево}
    else
      self.add(Dictionary^.right, word); {если коды символов больше корня,добавим с правое поддерево}
  end;
  
  { Абстракция для конечного вызова функции поиска }
  function _binTree.search(var word: string) : boolean;
  var
    reserveDictionary: PDictionary; {Резервная переменная ссылающеяся на адрес дерева}
  begin
    reserveDictionary := self._search(self.Dictionary, word);
    if (reserveDictionary <> nil) then
      Result := true
    else
      Result := false;
  end;
  
  { Функция поиска по бинарному дереву }
  function _binTree._search(var Dictionary: PDictionary; word: string) : PDictionary;
  var
    save: PDictionary := nil;
  begin
    {Для начала проверим наличие корней в дереве, если нету,то выведем нил}
    if (Dictionary = nil) then
    begin
      Result := nil; { Выводим нил, так как дерево пустое }
      exit;
    end;
    
    { Если равенство с корнем дерева }
    if (Dictionary^.data = word) then
    begin
      save := Dictionary; { Запишем его адрес }
    end else begin
      if (Dictionary^.data > word) then { Если введенный элемент меньше корня }
        save := self._search(Dictionary^.left, word) { ищем в левом поддереве }
      else
        save := self._search(Dictionary^.right, word); { ищем в правом поддереве }
    end;
    
    Result := save;
  end;
end.
  • Вопрос задан
  • 168 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы