Примечание: все это предполагает, что вы находитесь в бинарном дереве поиска, поэтому возвращение минимального элемента означает возврат самого левого элемента.
Это означает, что ваш рекурсивный вызов довольно прост:
min(node):
if this node has a left node:
return min(node.left)
if this node does not have a left node:
return this node's value
Логика заключается в том, что если у нас нет другого левого узла, то мы являемся самым левым узлом, поэтому мы являемся минимальным значением.
Теперь на Java:
int min(TreeNode n){
if (n.left == null)
return n.value;
return min(n.left); // n.left cannot be null here
}
Теперь, чтобы объяснить ваши результаты, рассмотрим, как работает этот метод. Он вызывает метод на следующем узле (min(n.left)
) перед продолжением. В вашем случае у вас был println
после этого рекурсивного вызова. Поэтому println
внутри рекурсивный вызов пошел первым. Таким образом, ваши отпечатки начались с нижней части дерева и вернулись обратно. Это объясняет печать в обратном порядке.
Затем ваш метод возвратил 11
как ваш результат, потому что (как объяснил другой ответ) ваш n = n.left
не влиял ни на один из ваших рекурсивных суб-вызовов, только на один в текущем вызове функции. Это означает, что вы вернули левый узел корня, а не самого дальнего левого потомка.
Надеюсь, это имеет смысл. Если вам нужно что-то разъяснить, оставьте комментарий или что-то. Поначалу рекурсия может оказаться довольно сложной задачей.