Если все дерево полностью не меняется каждый раз, вы можете получить лучшую производительность, не очищая дерево, а создавая отдельно новый список элементов (просто идентифицируя элементы), сортируя этот список, затем обходя оба дерева порядок ... общий алгоритм выглядит примерно так (левый список - это «новый список», а правый список - «существующий список»):
LeftCur := 0;
RightCur := 0;
while (LeftCur < TotalLeft) and (RightCur < TotalRight) then
begin
if LeftList[LeftCur] = RightList[RightCur] then
begin
// matches, so just advance
Inc(LeftCur);
Inc(RightCur);
end
else if LeftList[LeftCur] < RightList[RightCur] then
begin
// insert happens BEFORE RightCur
InsertLeftItemToRight;
Inc(RightCur);
Inc(TotalRight);
end
else if LeftList[LeftCur] > RightList[RightCur] then
begin
DeleteRightItem;
Dec(TotalRight);
end;
end;
While RightCur < TotalRight do
begin
DeleteRightItem;
Dec(TotalRight);
end;
While LeftCur < TotalLeft do
AppendLeftItemToRight;
Таким образом, список остается отсортированным, и вам нужно только завершить загрузку элемента в шагах InsertLeftItemToRight. В дереве, когда вы подходите, вы запускаете аналогичную процедуру для детей. Эта концепция основана на том факте, что элементы в существующем списке не будут сильно меняться или могут стоить полной загрузки.