是用于搜索二叉树中的值的searchVal
函数。二叉树的节点存储在向量nodeVec
中,第一个对象在向量中作为根。
节点结构
class bst{
public:
//other functions..//
int searchVal(int)
private:
bst *lLink;
int info;
bst *rLink;
}
在主要
中调用部分cout << "Enter Value to search ";
int val;
cin >> val;
int ret = nodeVec[0].searchVal(val);
if (ret == 2)
cout << "Value Not Found" << endl << endl;
else
cout << "Value Found" << endl << endl;
功能
int bst::searchVal(int val)
{
if (info != val)
{
if (info > val)
{
if (lLink != NULL)
lLink->searchVal(val);
else
return 2;
}
if (info < val)
{
if (rLink != NULL)
rLink->searchVal(val);
else
return 2;
}
}
if (info == val)
return 1;
}
在调试时(使用codeBlocks)我观察到在满足任何条件之后,例如,如果满足条件info==val
,则执行指针(IDE中指向正在处理的行的箭头)将转到{{1然后它会转到最近的searchVal
(从最后开始)但是它不会进入那个条件的块。它始终返回if
中info
或ret
1
答案 0 :(得分:4)
应该是
if(lLink!=NULL)
return lLink->searchVal(val);
^^^^^^
答案 1 :(得分:3)
searchVal
函数需要在每个代码路径上返回一个值 - 其他一切都有未定义的行为(这意味着任何事情都可能发生)。
在您对return
和lLink->searchVal
的来电中添加rLink->searchVal
。
(如果您的编译器没有就此发出警告,则需要启用该警告。)
答案 2 :(得分:3)
我认为您的代码中的主要问题是您没有返回子树搜索的结果;即你应该这样做:
if(lLink!=NULL)
return lLink->searchVal(val);
您错过了return
关键字。这意味着一些执行路径一直持续到函数的末尾,并且永远不会命中return
,这可能非常糟糕。编译器应该发出错误或警告。