"Максимальная глубина моих деревьев будет 3-5"
Эта глубина рекурсии не повлияет на размер стека по умолчанию для любой версии Windows или любой другой системы, которую вы когда-либо увидите, у которой нет "Осторожно! Стек крошечный!" намазанный всем этим. Большинство программ выполняют более 3-5 вызовов без какой-либо рекурсии.
Так что, пока ваша рекурсия идет только «вниз» по вашему дереву, а не «поперек» его ширины, вы в порядке. Если, конечно, вы не делаете что-то действительно необычное, например, помещаете огромный массив в стек как локальную переменную.
Прав ли я, что ваша (после заказа) рекурсия выглядит примерно так?
void doNode(struct node *n) {
for (int i = 0; i < n->num_nodes; ++i) {
doNode(n->nodes[i]);
}
// do some work on this node
}
Если это так, то для 3-5 уровней он будет использовать только один стек: если он выглядит так:
void doNode(struct node *n) {
int myRidiculousArray[100*1000] = { 0 };
for (int i = 0; i < n->num_nodes; ++i) {
doNode(n->nodes[i]);
}
// do some work on this node, using myRidiculousArray
}
Если у вас есть миллионы узлов, то можно избежать некоторого выигрыша в производительности, избегая затрат на вызов функции для каждого узла. Но сначала запишите это простым способом, а затем вернитесь и посмотрите на него позже , если вы когда-нибудь отчаянно нуждаетесь в немного большей производительности. Из-за того, что накладные расходы при вызове функции для каждого узла являются редкостью, причина в том, что ваш код медленный - это происходит, но обычно только после того, как вы исправили кучу других, что еще хуже, замедлений.