0

下面是一个searchVal在二叉树中搜索值的函数。二叉树的节点存储在一个向量中,向量nodeVec中的第一个对象作为根。

节点结构

class bst{
public:
    //other functions..//
    int searchVal(int)
private:
    bst *lLink;
    int info;
    bst *rLink;

}

在 main 中调用部分

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;
}

在调试(使用代码块)时,我观察到在满足任何条件后,例如,如果满足条件info==val,则执行指针(IDE 中的箭头指向正在处理的行)转到末尾,searchVal然后它转到最近if(从末尾) 但是它不会进入该条件的块。它总是返回info存储在根节点中的ret12

4

3 回答 3

4

应该

  if(lLink!=NULL)
  return lLink->searchVal(val);
  ^^^^^^
于 2013-11-08T12:40:32.327 回答
3

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

将 a 添加到您对和return的调用中。 lLink->searchValrLink->searchVal

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

于 2013-11-08T12:40:20.890 回答
3

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

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

您缺少return关键字。这意味着一些执行路径一直到函数的末尾,并且永远不会碰到 a return,这可能是非常糟糕的。尽管如此,编译器应该会发出错误或警告。

于 2013-11-08T12:42:05.407 回答