Форум: "Основная";
Текущий архив: 2002.01.17;
Скачать: [xml.tar.bz2];
ВнизИерархическая структура Найти похожие ветки
← →
vuk (2001-12-29 14:50) [16]to sky3d:
Все зависит от того, важен ли порядок следования узлов в линейном массиве. Если нет, то все достаточно просто.
Если да, то операция добавления узла несколько усложняется. Опять же, если дерево загружается один раз и не модифицируется то все просто. А теперь представьте что последовательность важна, дерево уже загружено, и после этого идут операции вставки...
Да и в любом случае, линейная структура хороша только для произвольного доступа к ее элементам. Но часто ли оно необходимо? Скорее всего, чаще приходится использовать последовательный перебор. А для этого достаточно и ссылочной структуры типа дерева или списка (только не того, что TList зовется, а настоящего, одно- или двухсвязного). К тому же скорость обычной вставки в ссылочных структурах, в отличие от линейных, не зависит от количества элементов.
К стати о птичках... Тут писали что в TTreeView элементы хранятся линейно. Дык вот:
function TTreeNode.GetItem(Index: Integer): TTreeNode;
begin
Result := GetFirstChild;
while (Result <> nil) and (Index > 0) do
begin
Result := GetNextChild(Result);
Dec(Index);
end;
if Result = nil then TreeViewError(SListIndexError);
end;
function TTreeNode.GetNextChild(Value: TTreeNode): TTreeNode;
begin
if Value <> nil then Result := Value.GetNextSibling
else Result := nil;
end;
function TTreeNode.GetNextSibling: TTreeNode;
begin
with FOwner do
Result := GetNode(TreeView_GetNextSibling(Handle, ItemId));
end;
Так что все равно получается хождение по дереву для эмуляции прямого доступа. Эффективность такого подхода при переборе с использованием индексного доступа представляете? :o(
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.01.17;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.004 c