ОБНОВЛЕНИЕ : я добавил одно изображение для ясного объяснения.
Насколько я понял ваш вопрос, вы застряли где-то между стеком рекурсии, который поддерживается каждый раз, когда вы вызывать ту же функцию внутри себя. Таким образом, каждая функция складывается сама по себе, пока не встретит оператор return, и в конечном итоге каждая функция начнет всплывать и очищать стек вызовов / стек рекурсии.
Позвольте мне попытаться объяснить, что происходит в вашем случае.
В вашей функции посещения вы продолжаете посещать левые узлы, пока не найдете узел, у которого нет левого потомка. До этого вы добавляли каждый левый узел, который вы посетили, в свой стек вызовов, который в конечном итоге вернется, когда ваша функция посещения вернется.
Теперь, когда вы находитесь на узле, у которого нет левого дочернего элемента, вы регистрируете его data, который является самым маленьким узлом в дереве. Надеюсь, это ясно до сих пор.
После этого ...
Вы снова начинаете вводить sh в стек вызовов для любого правого дочернего элемента узла, из которого вы только что вышли из системы .
Это снова добавляет правого дочернего элемента в стек вызовов, а затем выполняет для него функцию посещения, которая затем выводит из системы ваш второй самый маленький узел.
Проблема, которую я вижу здесь, заключается в вы не используете оператор return в конце функции посещения. Следовательно, функция сама выйдет после того, как попадет в закрывающие фигурные скобки.
Надеюсь, мне удалось немного прояснить ситуацию. Спасибо.
PS: Обратите внимание, на изображении, когда я зарегистрировал «1», я ошибочно назвал это шагом 4. Пожалуйста, назовите его 4.1, и вы не пострадаете от понимания остального. Кроме того, это изображение просто объясняет вашу проблему только там, где вы на самом деле не посещаете нулевого ребенка. Вы просто проверяете, является ли его дочерний элемент нулевым или нет.