Я думаю, это очень хорошо! Однако я могу сказать одну или две вещи, которые могут помочь вам улучшить это.
1 - Использование статических переменных. Это не запрещено, но вам следует избегать этого. Теперь, как бы вы, учитывая, что ваше решение является рекурсивным по природе, и вам нужны общие данные между вызовами?
Общий подход заключается в использовании второй функции, которая упаковывает рекурсивный вызов и передает ему дополнительные параметры. В вашем случае:
void eachLevelSum(struct tree*);
static void eachLevelSumRecursive(struct tree*, int level, int* results);
А потом, что-то вроде:
void eachLevelSum(struct tree* t) {
int results[100];
eachLevelSumRecursive(t, 0, results);
return;
}
Тогда в вашей рекурсивной функции, когда бы вы ни входили в рекурсию, вы можете передать параметр уровня как уровень + 1 вместо того, чтобы делать уровень ++ и уровень-- = D, как это:
eachLevelSumRecursive(t->left, level + 1, results);
eachLevelSumRecursive(t->right, level + 1, results);
Обратите внимание, что это не только немного чище, но и имеет и другие преимущества. Например, этот подход можно использовать в многопоточной среде, а другой - нет, поскольку он опирается на статические переменные.
2 - Вы можете захотеть дополнительно инкапсулировать свое дерево, используя typedefs и функции, которые изменяют структуру. Если вы хотите больше информации об этом, спросите. Это совсем не обязательно для вашей тренировки.
3 - Помните, что имена функций обычно начинаются со строчных букв.
И это все, что я должен сказать, ваш код довольно чистый! Поздравляем!