Помощь - Поиск - Пользователи - Календарь
Полная версия: Поиск элемента в дереве
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
XBugiman
Структура:

PTree=^Tree;
Tree=record
info:string[70];
da,net:PTree;
end;


Нужна процедура/функция, которая возвратит указатель на элемент current содержащийся в дереве. (current: PTtree); В наличии есть root и currnet.
XBugiman
Прошк прощения, что сразу не уточнил. Нужно найти указатель на узел, который указывает на current.
В узлах содержатся не цифровые значения, а строки.
volvo
Цитата
В узлах содержатся не цифровые значения, а строки.
Зачем мне эта информация? Хоть записи, какая разница? Что, строки не сравниваются между собой так же, как и числа?

Цитата
Нужно найти указатель на узел, который указывает на current.
И что же ты собрался возвращать, если у тебя искомое значение содержится в root-е? Нет у него предка, что дальше?
XBugiman
Цитата(volvo @ 14.04.2009 16:54) *

Зачем мне эта информация? Хоть записи, какая разница? Что, строки не сравниваются между собой так же, как и числа?

И что же ты собрался возвращать, если у тебя искомое значение содержится в root-е? Нет у него предка, что дальше?

Нужно сравнивать не строки, а условие, что искомый! указатель указывает на узел current, нужно вернуть этот указатель. Он в дереве по умолчанию присутствует
volvo
В Турбо Паскале над указателями не определены никакие операции, кроме сравнения с nil. То есть, тебе надо пройти по дереву, КАЖДЫЙ указатель преобразовать к виду, в котором его можно сравнить с другим указателем (я надеюсь, ты в курсе, что $83DF:$000B и $7FFD:$400B указывают на одну и ту же ячейку памяти, хотя как видишь, сами значения сегментной части и смещений у них совершенно разные), и сравнить с приведенным к тому же виду current... То есть, что-то вроде:

function findptr(root: ttree; curr: ttree): ttree;
var p: ttree;
begin
if root = nil then findptr := nil
else
if (convert(root^.left) = convert(curr)) or (convert(root^.right) = convert(curr)) then findptr := root
else begin
p := findptr(root^.left, curr);
if p = nil then p := findptr(root^.right, curr);
findptr := p;
end;
end;
Функцию Convert попробуй написать сам...

passat
Цитата(XBugiman @ 14.04.2009 19:28) *

Нужно сравнивать не строки, а условие, что искомый! указатель указывает на узел current, нужно вернуть этот указатель. Он в дереве по умолчанию присутствует

Не слишком ли Вы завернули задание?
Узел current при любом раскладе обязан содержать ключ. Какправило, ключ уникален.
Исходя из такой постановки, надо пройти по дереву и найти родителя искомого узла. Поиск самый что ни есть обыкновенный по ключу. А что там является ключом - числа, строки или бегемоты - не имеет ни малейшего значения.
XBugiman
Да вообще то думаю не слишком.
Алгоритм применяется в Делфи, поэтому соот-но функции conv() ни к чему.
Само задание, сделать игру 20 вопросов. А конкретно этот кусок алгоритма используется для определения вопроса на который пользователь ответил неверно, и требуется ввести новый вопрос и объект. Думаю стоит создать отдельную тему в разделе Делфи.

Игра 20 вопросов
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.