Этот код содержит неопределенное поведение, так что с точки зрения юриста-языка это просто удача, что он работает.
На практике, наиболее вероятно, что происходит (на архитектурах X86), это то, что функция min()
сохраняет результат в регистре eax
.
Поскольку после рекурсивного вызова функция вообще ничего не делает, регистр eax
остается в любом состоянии, которое оставила вызываемая функция, и это неявно становится результатомсамой функции.
Короче говоря, min(root->left);
компилируется точно так, как если бы это было return min(root->left);
из чистой удачи.
Редактировать :
Дополнительное примечание: Ваша функция написана таким образом, что допускается нечто, называемое хвостовой рекурсией , которое может или не может вступать в игру здесь.В любом случае, вы никогда не должны полагаться на это поведение.