2017-01-21 7 views
0

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

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

Вопрос: Как сохранить базовый переменный словарь? Я имею в виду его указатель. Переписать переменную на другую переменную не поможет. Она написана на тот же адрес, и все здесь, (

К сожалению плохой английский

Использование:

uses MrBinTree; 

var binTree := new _binTree; 
binTree.search('test'); 

Модуль:

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. 
+0

в любом случае вы r бинарное дерево имеет утечку, если вы вводите последовательное значение (например, 1, 2, 3, 4, 5 и т. д.), тогда вы получите большой штраф за производительность и отсутствие индекса вообще. если вы хотите пример реализации двоичного дерева, вы можете посмотреть здесь: https://svn.code.sf.net/p/alcinoe/code/ в блоке ALAVLBinaryTree (самобалансирующиеся двоичные деревья) – loki

ответ

0

пример того, как осуществлять поиск. в бинарном дереве:

{***************************************************************************************} 
function TALBaseAVLBinaryTree.InternalFindNode(idVal: pointer): TALBaseAVLBinaryTreeNode; 
var N1: TALBaseAVLBinaryTreeNode; 
    CmpRes: Integer; 
begin 
    N1 := FHead; 
    while Assigned(N1) do begin 
    CmpRes := CompareNode(IdVal, N1); 
    if CmpRes = 0 then begin 
     Result := N1; 
     Exit; 
    end 
    else N1 := N1.ChildNodes[CmpRes > 0]; 
    end; 

    Result := nil; 
end; 

 Смежные вопросы

  • Нет связанных вопросов^_^