Вам не нужно отслеживать количество узлов на уровень.
Определите горизонтальное положение каждого узла как количество правых потомков минус количество левых потомков, которые были пройдены от корня до узла Ширина тогда будет максимальной горизонтальной позицией минус минимальная горизонтальная позиция. Позиции мин / макс могут передаваться вокруг рекурсивного обхода в массиве из двух компонентов.
Вот пример кода того, что я имею в виду:
int getWidth(Node node) {
// current[0] is the number of left children traversed of the current path
// current[1] is the number of right children traversed of the current path
int[] current = { 0, 0 };
// extremes[0] is the minimum horizontal position
// extremes[1] is the maximum horizontal position
int[] extremes = { 0, 0 };
computeExtremes(node, current, extremes);
return (extremes[1] - extremes[0]);
}
void computeExtremes(Node node, int[] current, int[] extremes) {
if (node == null) { return; }
int position = current[1] - current[0];
if (extremes[0] > position) {
extremes[0] = position;
}
if (extremes[1] < position) {
extremes[1] = position;
}
current[0]++;
computeExtremes(node.left, current, extremes);
current[0]--;
current[1]++;
computeExtremes(node.right, current, extremes);
current[1]--;
}