我得到警告,说它到达了非void函数的结尾。应该在二进制搜索树中搜索。如果认为合适,则返回SUCCESS。 我该怎么解决?
TREEResult FindInBST(Node<T>* node,int key, void** value,int treeSize)
{
if(node!=NULL && node->key==key)
{
*value=node->data;
return SUCCESS;
}
if(treeSize==0)
{
return FAILURE;
}
if(node->key<key)
{ treeSize--;
FindBST(node->rightSon,key,value,treeSize);
}
else
{ treeSize--;
FindBST(node->LeftSon,key,value,treeSize);
}
}
答案 0 :(得分:1)
您保证会返回TREEResult
,但不会在两个递归调用中返回。值得庆幸的是,编译器对此发出警告,因为违反此规则是未定义行为。
要解决此问题,您需要更改:
FindBST(node->rightSon,key,value,treeSize);
到
return FindBST(node->rightSon,key,value,treeSize);
还有
FindBST(node->LeftSon,key,value,treeSize);
到
return FindBST(node->LeftSon,key,value,treeSize);
正如@molbdnilo在评论中提到的,与非递归调用相比,递归调用没有“魔术”。 如果您要退货,则需要这样做。
无法返回值是未定义行为。
这些递归调用返回的值将从基本情况下返回的SUCCESS或FAILURE结果之一传播,具体取决于搜索是否找到了该项目。