Цитата(Napalmx @ 16.9.2009, 15:59 ) | | Узлов может быть достаточно большое количество. |
Насколько большое? на моей машине (AMD turion 64x2 1.9 ГГц) поиск по дереву из 11 100 элементов (4 уровня вложения) происходит максимум за 1 миллисекунду, чем ближе к началу - тем быстрее (не тики же считать ).
Вот другой код, состряпанный сегодня на основе исходников VT (возможно, неоптимальный и некрасивый, но зато выполняется за 0 миллисекунд на том же дереве, разницу меньше 1мс считать просто лень).
| Код | function TForm1.GetNodeByIndex(index: integer): pVirtualNode; var tmpNode: pVirtualNode; tmpIndex: integer; begin Result := nil; // проверяем, есть ли вообще такой элемент if (index > vt.AbsoluteIndex(vt.GetLast)) or (index < 0) then exit;
// начинаем искать tmpIndex := 0; tmpNode := vt.GetFirst;
while Assigned(tmpNode) and (tmpIndex <> index) do begin // пролистываем по элементам одного уровня, пока не перескочим за искомый индекс while Assigned(tmpNode) and (tmpIndex < index) do begin inc(tmpIndex, tmpNode.TotalCount); if tmpIndex <= index then tmpNode := tmpNode.NextSibling end; if (tmpIndex > index) then begin if Assigned(tmpNode) then tmpNode := tmpNode.LastChild; // чуть перескочили - берем последний дочерний узел while Assigned(tmpNode) do begin // отматываем назад dec(tmpIndex, tmpNode.TotalCount); if (tmpIndex > index) then tmpNode := tmpNode.PrevSibling else break; end; end; // и так до тех пор, пока не найдем узел с нужным индексом. end; Result := tmpNode; end;
|
|