У меня проблемы с пониманием того, как этот метод дерева двоичного поиска подсчитывает узлы, я просмотрел много примеров в Интернете, однако не могу найти пример, который бы точно объяснил, что происходит.
Вот пример:
public int nodes() {
int leftNodes = 0;
if (left != null) {
leftNodes = left.nodes();
}
int rightNodes = 0;
if (right != null) {
rightNodes = right.nodes();
}
return leftNodes + rightNodes + 1;
}
Вот как я понимаю процесс этого метода, и, возможно, кто-то может помочь мне понять, где я ошибаюсь.
- Метод вызывается извнесебя из объекта BTS;"tree.nodes () и т. д.".
- int leftNodes объявляется и устанавливается равным 0.
- Если есть левый узел (предположим, что он есть), тогда будет присвоено значение leftNodesк возвращаемому значению вызова узла ();
- Рекурсивный вызов снова пройдет через метод узлов, снова присвоив leftNodes ноль.
Так что я не делаюпонять, где переменная leftNodes увеличивается?Кажется, что он просто повторяется через метод снова, но значение не меняется, и, как я вижу, leftNodes и rightNodes всегда будут равны 0.
Я нашел другой пример подсчета BTS, этот с использованием C ++
int CountNodes(node*root)
{
if(root==NULL)
return 0;
if(root->left!=NULL)
{
n=n+1;
n=CountNodes(root->left);
}
if(root->right!=NULL)
{
n=n+1;
n=CountNodes(root->right);
}
return n;
}
Мне гораздо проще следовать этому методу, так как n явно увеличивается каждый раз, когда обнаруживается узел.
Мой вопрос заключается в том, как увеличивается значение leftNodes / rightNodes в рекурсивевызов?