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