二叉树递归min函数疑问:最小值如何返回至main函数?
为啥你的最小值返回逻辑有问题?
兄弟,我太懂你的疑惑了——你这段代码看似能跑,但其实藏着未定义行为的bug,现在的“正常运行”完全是巧合!
先拆解下你的代码问题:
你写的min函数里,最后一个else分支调用了min(root->left),但没有把这个递归调用的结果return出去!
具体执行流程(拿你给的二叉树举例)
你的二叉树按二叉搜索树构建的话,左子链是17 → 14 → 12(12的右是13),右子链是17→19→18、20→21,理论最小值是12。
- 第一次调用
min(17):进入else分支,调用min(14) - 第二次调用
min(14):进入else分支,调用min(12) - 第三次调用
min(12):它的left是NULL,所以return 12给上一层的min(14) - 重点来了:
min(14)拿到了12这个返回值,但它没有把这个值return出去,执行完min(root->left)就结束了。这时候C++会返回一个随机的垃圾值! - 同理,
min(17)也会返回一个垃圾值给main函数——你觉得结果对,只是刚好这个垃圾值和12巧合相同而已,换个环境或者树结构,结果肯定会错。
修正后的代码
只需要在最后一个else分支加上return,把递归结果逐层传递回去:
struct Node { int data; Node* left; Node* right; }; int min(Node* root) { if(root == NULL) { // 这里提个小建议:空树没有最小值,返回0容易混淆(如果树里有0的话) // 可以考虑抛出异常或者用std::optional<int>(C++17及以上)来处理 return 0; } else if(root->left == NULL) { return root->data; } else { // 关键:把递归调用的结果return给上层 return min(root->left); } }
这样修改后,每次递归调用都会把下层返回的最小值往上传递,最终正确回到main函数里。
内容的提问来源于stack exchange,提问作者Naruto Uzumaki
相关产品推荐
相关产品推荐

