Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Поиск элемента в дереве

Автор: XBugiman 14.04.2009 19:37

Структура:


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


Нужна процедура/функция, которая возвратит указатель на элемент current содержащийся в дереве. (current: PTtree); В наличии есть root и currnet.

Автор: volvo 14.04.2009 19:41

http://volvo71.narod.ru/faq_folder/bin_tree.htm#bintree_search

Автор: XBugiman 14.04.2009 20:39

Прошк прощения, что сразу не уточнил. Нужно найти указатель на узел, который указывает на current.
В узлах содержатся не цифровые значения, а строки.

Автор: volvo 14.04.2009 20:54

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

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

Автор: XBugiman 14.04.2009 22:28

Цитата(volvo @ 14.04.2009 16:54) *

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

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

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

Автор: volvo 15.04.2009 15:15

В Турбо Паскале над указателями не определены никакие операции, кроме сравнения с 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 15.04.2009 19:11

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

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

Не слишком ли Вы завернули задание?
Узел current при любом раскладе обязан содержать ключ. Какправило, ключ уникален.
Исходя из такой постановки, надо пройти по дереву и найти родителя искомого узла. Поиск самый что ни есть обыкновенный по ключу. А что там является ключом - числа, строки или бегемоты - не имеет ни малейшего значения.

Автор: XBugiman 26.04.2009 18:45

Да вообще то думаю не слишком.
Алгоритм применяется в Делфи, поэтому соот-но функции conv() ни к чему.
Само задание, сделать игру 20 вопросов. А конкретно этот кусок алгоритма используется для определения вопроса на который пользователь ответил неверно, и требуется ввести новый вопрос и объект. Думаю стоит создать отдельную тему в разделе Делфи.

http://forum.pascal.net.ru/index.php?showtopic=24063