title: How to reset the pointer of a nested binary tree?
body: <p>In General, write a module to work with a binary tree. As values we have the word. The essence of the module, the search of words in the dictionary. And so, the problem: if you repeatedly call the function search with the word which is in the dictionary - it finds everything is OK. After enter few times wrong words, and then again a word from the dictionary. Will be given instead of True -> False.</p>
  
  <p>It seems to me that overwritten the original pointer to the parent, with each recursive iteration _search. And in later branches, just not the desired word.</p>
  
  <p>Question: How to keep the base variable Dictionary? I mean its a pointer. Overwrite variable to another variable does not help. It is written to the same address and all here ;(</p>
  
  <p>Sorry is bad english.</p>
  
  <p>Usage:</p>
  
  <pre><code>uses MrBinTree;
  
  var binTree := new _binTree;
  binTree.search('test');
  </code></pre>
  
  <p>Module:</p>
  
  <pre><code>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 &lt;&gt; 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 &lt; 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 &lt;&gt; 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 &gt; word) then { Если введенный элемент меньше корня }
          save := self._search(Dictionary^.left, word) { ищем в левом поддереве }
        else
          save := self._search(Dictionary^.right, word); { ищем в правом поддереве }
      end;
  
      Result := save;
    end;
  end.
  </code></pre>