| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Обход дерева |
| Автор: aktuba 24.1.2007, 17:38 |
| Совсем перестал соображать, поможете? Задача такая. Есть заполненное дерево. Пример: Исходное дерево: +Узел1 | +Узел2(!) | | | +Узел3(!) | | | +Узел4 | +Узел5 | | | +Узел6(!) | +Узел7(!) На основе этого дерева необходимо получить следующее: +Узел2(!) | | | +Узел3(!) | +Узел6 | +Узел7(!) Есть идеи? |
| Автор: voha 24.1.2007, 17:43 |
| Рекурсия поможет |
| Автор: aktuba 24.1.2007, 17:49 |
| voha, это я и сам знаю. Я не могу понять, как определять (или передавать) Parent добавляемого узла... |
| Автор: voha 24.1.2007, 18:04 |
| TNode.Parent AddChild или давай подробней |
| Автор: aktuba 24.1.2007, 18:13 |
| voha, посмотри внимательно верхний пример. Узел6 добавить необходимо, но Узел5 добавлять нельзя. Как определить в какой узел его теперь добавлять? |
| Автор: Bose 24.1.2007, 18:22 |
тогда добавляй в Узел5.Parent или(уже не по примеру), если в Узел5.Parent нельзя, то в Узел5.Parent.Parent p.s. на некорректно заданный вопрос нельзя получить корректный ответ |
| Автор: voha 24.1.2007, 18:23 |
| запоминать последний добавленный узел, если последний добавленный = nil, значит добавляем в корень, при переключении на следующий корневой Node в исходном дереве сбрасывать ссылку на последний добавленный узел ну если опять не то, тогда сдаюсь |
| Автор: aktuba 24.1.2007, 19:05 | ||||
Bose, и как определить в рекурсии это?
Вопрос задан корректно, прочитан не корректно voha,
Наверное не в корень, а в Parent Parent-а, если он вставлен и т.д. Но как узнать, вставлен или нет? |
| Автор: aktuba 24.1.2007, 19:43 |
| Bose, если не хочешь вникать в задачу - лучше не надо ничего писать, хорошо? Для всех остальных, пояснение. Есть исходное заполненное дерево. Из этого дерева необходимо по определенному условию выбрать узлы и их копии добавить в новое дерево, с сохранением структуры исходного дерева. Т.е., для исходного дерева вида +Узел1 | +Узел2(!) | | | +Узел3(!) | | | +Узел4 | +Узел5 | | | +Узел6(!) | | | +Узел7(!) | | | +Узел8 | | | +Узел9(!) | +Узел10(!) необходимо получить новое дерево +Узел2 | | | +Узел3 | +Узел6 | | | +Узел7 | | | +Узел9 | +Узел10 Для тех, кто читает через строку, поясняю. (!) - это просто показываю, какие узлы подходят под условие. Необходимо написать функцию, которая это делает. Кто поможет? |
| Автор: MetalFan 24.1.2007, 20:11 |
| как я понял, тебе нужно собрать всех первых детей? нет. все нечетные ноды? опять нет. лично я не вижу никакой закономерности в выборе нодов. парт.задание автору - составить внятный алгоритм "фильтрации" нодов |
| Автор: aktuba 24.1.2007, 20:53 | ||
Всех нодов, для которых выполняется определенное условие. И поменяй стиль общения, ок? P.S.: специально для Metalfan-a: добавить в новое дерево узлы, для которых выполняется одно из следующих условий: 1. присутствует дата окончания задания и сегодняшняя дата попадает в промежуток между началом задания и окончанием задания; 2. присутствует дата окончания задания, но сегодняшняя дата НЕ попадает в промежуток между началом задания и окончанием задания, и указан флаг переноса просроченных заданий; 3. отсутствует дата окончания и сегодняшняя дата = дате начала задания. Легче стало? |
| Автор: MetalFan 24.1.2007, 21:07 |
| aktuba, ты за своим стилем следи, ок? метод огрызания на всех тоже не очень хорош ;) тут никто не понял, что тебе надо. а вот про это в начале ни слова не было |
| Автор: aktuba 24.1.2007, 21:12 | ||||
MetalFan, это не огрызания...
Вот это издевательство. Вместо того чтобы спросить то, что не ясно - подколы... И если отвечаешь на вопрос - будь добр посмотреть другие ответы и вопросы, а не только верхний...
А ты отвечаешь только на первый пост? |
| Автор: Bose 24.1.2007, 21:46 | ||||
Я хочу. Просто у меня не получалось понять =) Вот пример в псевдокоде:
В VirtualTree узлы перебирются по-другому, к сожалению не помню точного синтаксиса, а вспоминать нет времени. Просто замени цикл for..do обхода на правильный(с использованием GetFirst,GetNext). Написать функцию function GetCopyFromNode(aNode:TVirtualNode):TVirtualNode; которая создаст экземпляр копии узла и вернёт указатель на него Конечно это не готовый ответ, но надеюсь, что этот код придаст верное направление твоим размышлениям. Добавлено @ 21:47 p.s. УсловиеВыполняется - функция, которая возварщает True, если для данного узла выполняются необходимые условия. |
| Автор: CatATonik 25.1.2007, 09:54 |
| Чой-то все нервные такие aktuba у VirtualTree есть такой метод CopyTo называется, это то что тебе надо, а детали я думаю сам додумаешь ЗЫ А вопрос и вправду не понятно был задан. |