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

Why does this recursive function behave different than intended?

本文关键字:不同于 递归函数 为什么      更新时间:2023-10-16

我正在写一棵二叉树,我被困在一个搜索函数上,它需要一个值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);

处理递归可能很棘手:d

除非根节点是叶节点,否则代码将始终返回return false您的代码向进行调用的函数返回true,而不是一直返回到原始调用者(递归之前)

假设您的树有三个元素,并且项目位于左叶所以在根节点中,你用左节点调用你自己所以它返回true给调用者(根节点),根节点对此不做任何处理,只是继续执行。

这个问题可以简单地解决,只需添加一个if语句来检查调用

的函数的返回值。
if (currentNode != nullptr)
{
    if(search(currentNode->left, x)) return true;
    if(search(currentNode->right, x)) return true;
}
return false;

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

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

总是返回false