为什么这个函数没有返回预期值

时间:2013-11-08 12:23:15

标签: c++ function recursion return

下面的

是用于搜索二叉树中的值的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(从最后开始)但是它不会进入那个条件的块。它始终返回ifinforet

中存储在根节点中的1

3 个答案:

答案 0 :(得分:4)

应该是

  if(lLink!=NULL)
  return lLink->searchVal(val);
  ^^^^^^

答案 1 :(得分:3)

searchVal函数需要在每个代码路径上返回一个值 - 其他一切都有未定义的行为(这意味着任何事情都可能发生)。

在您对returnlLink->searchVal的来电中添加rLink->searchVal

(如果您的编译器没有就此发出警告,则需要启用该警告。)

答案 2 :(得分:3)

我认为您的代码中的主要问题是您没有返回子树搜索的结果;即你应该这样做:

if(lLink!=NULL)
    return lLink->searchVal(val);

您错过了return关键字。这意味着一些执行路径一直持续到函数的末尾,并且永远不会命中return,这可能非常糟糕。编译器应该发出错误或警告。