递归查找BST最小节点时返回错误值且触发非void函数返回警告
问题根因
你编写的递归查找函数错误核心是没有返回递归调用的执行结果:
当bst->lc不为空时,你仅触发了minValue(bst->lc)的递归调用,但没有将该调用的返回值作为当前函数的返回值,函数会继续执行后续的return bst逻辑,最终始终返回你最初传入的根节点,因此返回值错误。你遇到的返回值警告属于编译器检测到分支返回逻辑不严谨的提示。
解决方法
修改递归函数,将左子树的递归查找结果作为返回值返回即可,修改后代码如下:
BSTPTR minValue(BSTPTR bst){ if(!bst) return nullptr; // 存在左子节点时,返回左子树查找的最小节点结果 if(bst->lc) return minValue(bst->lc); // 没有左子节点,当前节点就是最小节点 return bst; }
修改后的逻辑和你编写的迭代版本逻辑完全等价:不断向左子树方向查找,直到某个节点不存在左子节点时,该节点就是BST的最小节点。修改后所有分支都有明确返回值,对应的警告也会同步消除。
额外优化提示:你的迭代版本未做空指针校验,如果传入空BST会触发空指针访问崩溃,建议参考递归版本补充空指针判断逻辑:
BSTPTR minValue(BSTPTR bst){ if(!bst) return nullptr; while(bst->lc){ bst=bst->lc; } return bst; }
内容的提问来源于stack exchange,提问作者ravi
相关产品推荐
相关产品推荐

