Вниз
Скачать: CL | DM;

Деревья и рекурсия   Найти похожие ветки 

 
ydv   (2004-07-12 11:37) [0]

Есть такая задачка.
Дана таблица вида:
codeup     name       codethis
0      | Авто       | 10
0      | Мото       | 20
10     | Жигули     | 40
20     | Ява        | 50
40     | модель 2106| 60
50     | модель 350 | 70
40     | модель 2109| 80

в результате некоторой обработки получается дерево вида:
-Авто
   -Жигули
        -модель 2106
        -модель 2109
-Мото
   -Ява
        -модель 350

Стоит задача выбрать все элементы, относящиеся, например, к ветке Авто. Понимаю, что надо применять рекурсию. А вот как - не знаю.


 
MBo ©   (2004-07-12 11:59) [1]

логика:

procedure SelectChilds(Item:TTreeItem);
для каждого Child do begin
 выбрать его;
 SelectChilds(Child);
end;


 
ydv   (2004-07-12 12:22) [2]

Дело в том, что это не VCL-дерево (TTreeView), а просто таблица, которую можно представить в виде дерева для наглядности.


 
Sheng ©   (2004-07-12 12:25) [3]

Напиши, каким образом представлены данные после обработки (пример кода - описание массива)


 
ydv   (2004-07-12 12:33) [4]

а никаким, просто есть таблица и всё, которую можно в виде дерева представить, а можно и не представлять. Главная задача - выбирать все подчиненные элементы до самого последненго уровня и заполнять другую таблицу.


 
MBo ©   (2004-07-12 12:34) [5]

>Дело в том, что это не VCL-дерево (TTreeView), а просто таблица
Ничего в принципе не изменится - вместо типа TTreeItem твой будет, а детишки у тебя - раз имеется дерево - значит, как-то организованы.


 
Sheng ©   (2004-07-12 12:45) [6]

codeup     name       codethis  selected
0      | Авто       | 10       | no
0      | Мото       | 20       | no
10     | Жигули     | 40       | no
20     | Ява        | 50       | no
40     | модель 2106| 60       | no
50     | модель 350 | 70       | no
40     | модель 2109| 80       | no

procedure Sel(Num: Integer);
var
 i: Integer;
begin
 for i:=1 to Length(Массив) do
  if Массив[1,i]=Num then  // проверяем принадлежность
    begin
      Массив[4,i]:=True;   // помечаем как выбранный
      Sel(Массив[3,i]);    // вызываем со сл. типом
    end;
end;

вызов: Sel(10);

теоретически, должно работать


 
ydv   (2004-07-12 13:09) [7]

Ок. Попробую.


 
Sheng ©   (2004-07-12 13:34) [8]

Да, и ещё в условии надо поставить проверку, если элемент не выделен.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.02 c
14-1089138441
Dradons
2004-07-06 22:27
2004.07.25
Windows 2000 server и Сервис паки


14-1089300094
СатирЪ
2004-07-08 19:21
2004.07.25
Proxies.dcu


1-1089791241
mishabik
2004-07-14 11:47
2004.07.25
Отладчик Delphi


14-1088935805
Rouse_
2004-07-04 14:10
2004.07.25
С Днем Рождения 4 июля


3-1088532595
3APA3A
2004-06-29 22:09
2004.07.25
Где хранятся юзеры и пароли?




   Наверх