Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обход дерева, VirtualTreeView 
:(
    Опции темы
aktuba
Дата 24.1.2007, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Совсем перестал соображать, поможете?
Задача такая. Есть заполненное дерево. Пример:

Исходное дерево:

+Узел1
|
+Узел2(!)
|     |
|     +Узел3(!)
|     |
|     +Узел4
|
+Узел5
|     |
|     +Узел6(!)
|
+Узел7(!)

На основе этого дерева необходимо получить следующее:

+Узел2(!)
|     |
|     +Узел3(!)
|
+Узел6
|
+Узел7(!)

Есть идеи?

Это сообщение отредактировал(а) aktuba - 24.1.2007, 17:38


--------------------
user posted image
PM MAIL WWW Skype   Вверх
voha
Дата 24.1.2007, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 22.1.2007
Где: Артемовск

Репутация: нет
Всего: нет



Рекурсия поможет
PM MAIL   Вверх
aktuba
Дата 24.1.2007, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



voha, это я и сам знаю. Я не могу понять, как определять (или передавать) Parent добавляемого узла...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
voha
Дата 24.1.2007, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 22.1.2007
Где: Артемовск

Репутация: нет
Всего: нет



TNode.Parent

AddChild

или давай подробней
PM MAIL   Вверх
aktuba
Дата 24.1.2007, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



voha, посмотри внимательно верхний пример. Узел6 добавить необходимо, но Узел5 добавлять нельзя. Как определить в какой узел его теперь добавлять?


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Bose
Дата 24.1.2007, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



Цитата(aktuba @  24.1.2007,  18:13 Найти цитируемый пост)
 Как определить в какой узел его теперь добавлять?


тогда добавляй в Узел5.Parent 

или(уже не по примеру), если в Узел5.Parent нельзя, то в Узел5.Parent.Parent

p.s. на некорректно заданный вопрос нельзя получить корректный ответ smile 





PM MAIL WWW Skype   Вверх
voha
Дата 24.1.2007, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 22.1.2007
Где: Артемовск

Репутация: нет
Всего: нет



запоминать последний добавленный узел, если последний добавленный = nil, значит добавляем в корень, 
при переключении на следующий корневой Node в исходном дереве сбрасывать ссылку на последний добавленный узел

ну если опять не то, тогда сдаюсь smile
PM MAIL   Вверх
aktuba
Дата 24.1.2007, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Bose, и как определить в рекурсии это?

Цитата

на некорректно заданный вопрос нельзя получить корректный ответ smile 


Вопрос задан корректно, прочитан не корректно  smile 


voha

Цитата

запоминать последний добавленный узел, если последний добавленный = nil, значит добавляем в корень


Наверное не в корень, а в Parent Parent-а, если он вставлен и т.д. Но как узнать, вставлен или нет?




--------------------
user posted image
PM MAIL WWW Skype   Вверх
Bose
Дата 24.1.2007, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



Цитата(aktuba @  24.1.2007,  19:05 Найти цитируемый пост)
Наверное не в корень, а в Parent Parent-а, если он вставлен и т.д. Но как узнать, вставлен или нет?


Очень просто:

Цитата

+Узел1
|
+Узел2(!)
|     |
|     +Узел3(!)
|     |
|     +Узел4
|
+Узел5
|     |
|     +Узел6(!)
|
+Узел7(!)

Проверяй, если у узла есть восклицательный знак (!) в скобках, значит он вставлен, если знака нет - значит не вставлен. smile 
PM MAIL WWW Skype   Вверх
aktuba
Дата 24.1.2007, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Bose, если не хочешь вникать в задачу - лучше не надо ничего писать, хорошо?

Для всех остальных, пояснение. Есть исходное заполненное дерево. Из этого дерева необходимо по определенному условию выбрать узлы и их копии добавить в новое дерево, с сохранением структуры исходного дерева. Т.е., для исходного дерева вида

+Узел1
|
+Узел2(!)
|     |
|     +Узел3(!)
|     |
|     +Узел4
|
+Узел5
|     |
|     +Узел6(!)
|           |
|           +Узел7(!)
|           |
|           +Узел8
|                 |
|                 +Узел9(!)
|
+Узел10(!)

необходимо получить новое дерево

+Узел2
|     |
|     +Узел3
|
+Узел6
|     |
|     +Узел7
|     |
|     +Узел9
|
+Узел10

Для тех, кто читает через строку, поясняю. (!) - это просто показываю, какие узлы подходят под условие.

Необходимо написать функцию, которая это делает. Кто поможет?

Это сообщение отредактировал(а) aktuba - 24.1.2007, 19:52


--------------------
user posted image
PM MAIL WWW Skype   Вверх
MetalFan
Дата 24.1.2007, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



как я понял, тебе нужно собрать всех первых детей?
нет. все нечетные ноды?
опять нет.
лично я не вижу никакой закономерности в выборе нодов.
парт.задание автору - составить внятный алгоритм "фильтрации" нодов

Это сообщение отредактировал(а) MetalFan - 24.1.2007, 20:19


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
aktuba
Дата 24.1.2007, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Цитата

парт.задание автору - составить внятный алгоритм "фильтрации" нодов


Всех нодов, для которых выполняется определенное условие. И поменяй стиль общения, ок?

P.S.: специально для Metalfan-a: добавить в новое дерево узлы, для которых выполняется одно из следующих условий:

1. присутствует дата окончания задания и сегодняшняя дата попадает в промежуток между началом задания и окончанием задания;
2. присутствует дата окончания задания, но сегодняшняя дата НЕ попадает в промежуток между началом задания и окончанием задания, и указан флаг переноса просроченных заданий;
3. отсутствует дата окончания и сегодняшняя дата = дате начала задания.

Легче стало?

Это сообщение отредактировал(а) aktuba - 24.1.2007, 21:06


--------------------
user posted image
PM MAIL WWW Skype   Вверх
MetalFan
Дата 24.1.2007, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



aktuba, ты за своим стилем следи, ок? метод огрызания на всех тоже не очень хорош ;)
тут никто не понял, что тебе надо.
Цитата(aktuba @  24.1.2007,  20:53 Найти цитируемый пост)
для которых выполняется определенное условие

а вот про это в начале ни слова не было



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
aktuba
Дата 24.1.2007, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



MetalFan, это не огрызания... 

Цитата

как я понял, тебе нужно собрать всех первых детей?
нет. все нечетные ноды?
опять нет.
лично я не вижу никакой закономерности в выборе нодов.
парт.задание автору - составить внятный алгоритм "фильтрации" нодов


Вот это издевательство. Вместо того чтобы спросить то, что не ясно - подколы... И если отвечаешь на вопрос - будь добр посмотреть другие ответы и вопросы, а не только верхний...

Цитата

а вот про это в начале ни слова не было


А ты отвечаешь только на первый пост?

Это сообщение отредактировал(а) aktuba - 24.1.2007, 21:14


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Bose
Дата 24.1.2007, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



Цитата(aktuba @  24.1.2007,  19:43 Найти цитируемый пост)
Bose, если не хочешь вникать в задачу - лучше не надо ничего писать, хорошо?

Я хочу. Просто у меня не получалось понять =)

Вот пример в псевдокоде:

Код

procedure BuildCopy( aParentOriginal, aParentCopy:TVirtualNode)
var 
  tmpCurrentNode, aParentCopyNew:TVirtualNode;
begin
  for i:=0 to aParentOriginal.ChildNodeCount-1 do
  begin
     tmpCurrentNode:=aParentOriginal.Node[i];
     if  УсловиеВыполняется (tmpCurrentNode) then 
     begin
         aParentCopyNew:= GetCopyFromNode(tmpCurrentNode);
         aParentCopy.addchild(aParentCopyNew);
     end
     else
        aParentCopyNew:=aParentCopy;
     if tmpCurrentNode.childcount>0 then 
        BuildCopy(tmpCurrentNode, aParentCopyNew); 
  end;
end;


В VirtualTree узлы перебирются по-другому, к сожалению не помню точного синтаксиса, а вспоминать нет времени.  Просто замени цикл for..do обхода на правильный(с использованием GetFirst,GetNext).
Написать функцию
function GetCopyFromNode(aNode:TVirtualNode):TVirtualNode;
которая создаст экземпляр копии узла и вернёт указатель на него

Конечно это не готовый ответ, но надеюсь, что этот код придаст верное направление твоим размышлениям.

Добавлено @ 21:47 
p.s.  УсловиеВыполняется - функция, которая возварщает True, если для данного узла выполняются необходимые условия.
PM MAIL WWW Skype   Вверх
CatATonik
Дата 25.1.2007, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 12.1.2007
Где: Москва

Репутация: 6
Всего: 8



Чой-то все нервные такие smile 
aktuba у VirtualTree есть такой метод CopyTo называется, это то что тебе надо, а детали я думаю сам додумаешь  smile 

ЗЫ А вопрос и вправду не понятно был задан.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0964 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.