Логика выглядит разумной для меня, но мне кажется, что было бы довольно тривиально сделать ее примерно в два раза быстрее.
Прямо сейчас вы пересекаете каждое поддерево один раз, чтобы вычислить его высоту,затем вы перебираете снова, чтобы вычислить его баланс.
Так как ему все равно нужно пройти через поддеревья, чтобы выполнить свою работу, я бы calculateBalance
возвратил высоту дерева. Таким образом, довольно просто вычислить баланс и высоту за один проход.
Поскольку мы не хотим изменять указатель, передаваемый в эту функцию, я просто передам указатель по значению.
int calculateBalanceValue(BinaryNode *t)
{
if (t==nullptr)
return 0;
int left = calculateBalance(t->left);
int right = calculateBalance(t->right);
t->bal=abs(left -right);
return 1 + std::max(left, right);
}
Кроме того, если вы хотите критиковать рабочий код, вы можете проверить на веб-сайте Stack Exchange Code Review , который посвящен именно этому.