我正在编写一个二叉树,而且我停留在一个带x值的搜索函数上,并确定它是否是树中的叶子。
这就是我所拥有的:
bool search(Node<T>* ¤tNode, 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);
答案 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);
}
你总是会返回假。