为什么这个递归函数的行为与预期不同?

时间:2014-03-31 05:16:40

标签: c++ if-statement recursion binary-tree

我正在编写一个二叉树,而且我停留在一个带x值的搜索函数上,并确定它是否是树中的叶子。

这就是我所拥有的:

bool search(Node<T>* &currentNode, const T& x) const
{
    /* Base Case */
    if ( currentNode != nullptr && (leaf(currentNode) == true) && currentNode->data == x )
    {
        return true;
    }

    /* Recursive Case */
    else {

        if (currentNode != nullptr)
        {
        search(currentNode->left, x);
        search(currentNode->right, x);
        }

        //If first if condition is not met for all values then value must not exist
        return false;

        }


bool leaf(Node<T>* currentNode) const 
{
    if (currentNode != nullptr)
    {
    return ((currentNode->left == nullptr && currentNode->right == nullptr) ? true : false);        
    }
    else  
    {
        return true;
    }
}

代码总是返回false,为什么第一个IF语句永远不会被触发?

编辑: 代码呼叫搜索:

for (int i = 0; i < 101; i++)           
            if ((t.search(i) == true) ? cout << "LEAF FOUND: " << i  << endl : cout << " NOT A LEAF: " << i << endl);

2 个答案:

答案 0 :(得分:1)

处理递归可能很棘手:D。

除非根节点是叶子,否则您的代码将始终返回false 你的代码返回true,该函数使得调用不能一直回到原调用者(在递归之前)

假设您的树有三个元素,而该项目位于左侧叶子中 因此,在根节点中,您使用左侧节点调用自己,因此它返回true给调用者(根节点),根节点对此不执行任何操作,只是继续执行。

只需添加一个if语句来检查所调用函数的返回值

,就可以简单地解决这个问题
if (currentNode != nullptr)
{
    if(search(currentNode->left, x)) return true;
    if(search(currentNode->right, x)) return true;
}
return false;

答案 1 :(得分:0)

因为你没有从搜索方法返回布尔值:

if (currentNode != nullptr)
{
search(currentNode->left, x);
search(currentNode->right, x);
}

你总是会返回假。