Для максимального ускорения вам нужно упорядочить узлы в памяти так, чтобы они сохранялись в непрерывном блоке в том порядке, в котором вы их посещаете.
например, если у вас есть дерево, определенное следующим образом.
1
/ \
2 3
/ \ /\
4 5 6 7
/\ / /\
8 9 10 11 12
/ \ \
13 14 15
Тогда функция посещения, как описано, будет посещать узлы в следующем порядке
1
2
4
8
13
14
9
5
3
6
10
7
11
12
15
Теперь, если вы упорядочите узлы в памяти как непрерывный блок из 15 выделений и сохраните узлы в порядке, показанном выше, то вы, как правило, будете посещать узел, который имеет " пространственную локальность ". Это может улучшить количество попаданий в кэш в зависимости от размера структуры вашего узла и, таким образом, ускорить работу.
Для создания быстрого итеративного метода посещения всех узлов дерева только один раз и без рекурсии.
unsigned int g_StackDepth = 0;
BaseNodePtr* g_Stack[MAX_STACK_DEPTH];
void processTree (BaseNodePtr root, unsigned int & cnt )
{
g_Stack[g_StackDepth++] = root;
while( g_StackDepth > 0 )
{
BaseNodePtr curr = g_Stack[--g_StackDepth];
cnt++;
if ( curr->HasNext() )
{
g_Stack[g_StackDepth++] = curr->Next();
}
if ( curr->HasChild() )
{
g_Stack[g_StackDepth++] = curr->Child();
}
}
}
Насколько мне известно, в сочетании с указанным выше порядком вы должны получить примерно лучшую скорость, какую МОЖЕТЕ набрать.
Очевидно, что у этого есть ограничения, так как вы должны знать, насколько большой ваш стек может вырасти заранее. Хотя вы можете обойти это, используя вместо этого std :: vector. Однако использование std :: vector исключит все преимущества, которые обеспечивает итерационный метод, приведенный выше.
Надеюсь, это поможет:)