在leetcode上编译算法题好几次出现下面这个错误
In member function rangeSumBST Char 20: error: control reaches end of non-void function [-Werror=return-type]
在vs上能编译通过,在leetcode上就是通不过,将警告视为错误。
代码内容是一个递归算法,我觉得递归应该是能够找到出口退出的,非void函数部分有return的,但编译就是将错误定位在最后一行,提示没有return。
原来的代码:
int rangeSumBST(treeNode* rootNode, int L, int R) {
if (rootNode)
{
if (flag != 1)
{
rangeSumBST(rootNode->Lchild, L, R);
if (R == rootNode->data)
{
sum += R;
flag = 1;
}
if (flag == -1)
{
sum += rootNode->data;
}
if (L == rootNode->data)
{
sum += L;
flag = -1;
}
if (flag == 1)
{
return sum; //看这儿!!!!!!!
}
rangeSumBST(rootNode->Rchild, L, R);
}
}
else
return 0; //想办法修改最后那几行代码,有return,还不影响答案
}
在vs中也有类似的警告(xxx不是所有的控件路径都有返回值):
修改后的代码
可以查看自己的代码,最终需要返回什么,再在末尾重复一遍return result(不管是否能够执行到这一步骤,加上应该都不影响吧,根据具体情况来),
int sum = 0;
int flag = 0;
int rangeSumBST(treeNode* rootNode, int L, int R) {
if (rootNode)
{
if (flag != 1)
{
rangeSumBST(rootNode->Lchild, L, R);
if (R == rootNode->data)
{
sum += R;
flag = 1;
}
if (flag == -1)
{
sum += rootNode->data;
}
if (L == rootNode->data)
{
sum += L;
flag = -1;
}
if (flag == 1)
{
return sum;
}
rangeSumBST(rootNode->Rchild, L, R);
}
}
return sum; //修改此处,因为怎么样都需要返回一个sum,索性在末尾再重复一次return sum,解决了问题,也不影响真正的返回值。
}
代码修改后,会发现在vs中上面的那个警告也消失了。