Реализовать функцию, чтобы проверить, если бинарное дерево сбалансировано (то есть не два узла не отличаются по высоте от корня более чем на 1).
Решение:
int maxDepth(Node *root)
{
if(!root) return 0;
return 1 + max(maxDepth(root->left), maxDepth(root->right));
}
int minDepth(Node *root)
{
if(!root) return 0;
return 1 + min(minDepth(root->left), minDepth(root->right));
}
bool isBalanced(Node *root)
{
return maxDepth(root)-minDepth(root) <= 1;
}
Может кто-то помочь мне понять интуицию за этим решением? Я изо всех сил стараюсь «видеть» рекурсию за алгоритмами дерева. Я знаю, что maxDepth
и minDepth
должны найти высоту узла максимальной глубины и минимальной глубины в дереве, соответственно, но я не понимаю, как работает рекурсия.
Что еще более важно, я не совсем понимаю, как я мог придумать это решение самостоятельно. Поэтому были бы весьма полезны любые советы о том, как подойти к древовидным проблемам в целом.
Вы начинаете учиться с рекурсией с помощью алгоритмов дерева? –
@austinwernli да –
Ouch. Вы должны попытаться облегчить свое мышление рекурсивно. Попробуйте некоторые проблемы с http://codingbat.com/java/Recursion-1 .. Они помогут вам лучше понять это. –