二叉树上的递归搜索返回真和假
Recursive search on binary tree returning both true and false
对于赋值,我应该想出一个名为all_less
的递归函数,它接受指向任意树(TN<T>*
)的指针和一个T
参数。如果所有值都小于 T 参数,则返回 true,否则返回 false。
我的Tree
类的实例变量是这样的:
T value;
TN<T>* left;
TN<T>* right;
all_less
的函数原型如下所示:
template<class T>
bool all_less(TN<T>* t, T v)
由于我必须考虑一个未排序的二叉树,我认为递归地向下移动每个子树并检查每个值都可以正常工作。测试完这个函数后:
template<class T>
bool all_less(TN<T>* t, T v)
{
if(v <= t->value) {
return false;
} else if(v > t->value) {
if(t->right != nullptr && t->left != nullptr) {
all_less(t->right, v);
all_less(t->left, v);
}
}
return true;
}
在函数几乎总是返回 true 遇到一些问题后,我在 return true
之前放置了一些打印语句,return false
看看发生了什么。
例如,假设我们在二叉树中有值 12、15、14、5。使用以下方法运行我的函数:
TN<int>* t;
std::cout << all_less(t, 15);
作为输入,将输出以下内容:
true
false
true
true
最终结果最终为 true,即使返回了一次 false。我如何获取它,以便如果它返回 false,函数返回 false 并立即停止?还有没有更好的方法来实现此功能?我最初确实有几个额外的 if-else 语句来检查右/左子树是否为空并从那里继续,但这些似乎实际上并没有做任何事情。
您忽略了递归调用的返回值。
最终结果最终为 true,即使返回了一次 false。
该false
是从不同的函数调用返回的,并且已经消失在天空中的大比特桶中。
递归函数的工作方式与任何其他函数完全相同 - 如果您有
int f() { return 0:}
int g(int x) {
if (x == 0)
f();
return 1;
}
g(0)
将返回 1,即使 0 "返回一次"。
如果g(0)
应该返回 f()
的值,它必须显式地执行此操作:
int g(int x) {
if (x == 0)
return f();
return 1;
}
您还假设所有节点都有零个或两个子节点。
如果采用空树中的所有项目都小于值的约定,则可以编写
template<class T>
bool all_less(TN<T>* t, T v)
{
return !t
|| ( t->value < v
&& all_less(t->right, v)
&& all_less(t->left, v));
}
你的函数:
template<class T>
bool all_less(TN<T>* t, T v)
{
if(v <= t->value) {
return false;
} else if(v > t->value) { // Why do you need this check?
if(t->right != nullptr && t->left != nullptr) {
// This is wrong because it's possible for one them to
// nullptr while the other is not.
all_less(t->right, v);
all_less(t->left, v);
// The above function calls are no op. You are calling
// the function recursively but are ignoring the return
// values.
}
}
return true;
}
这应该有效:
template<class T>
bool all_less(TN<T>* t, T v)
{
if(v <= t->value) {
return false;
}
if(t->right != nullptr )
{
if ( !all_less(t->right, v) )
{
return false;
}
}
if ( t->left != nullptr)
{
if ( !all_less(t->left, v) )
{
return false;
}
}
return true;
}
附言:未经测试的代码。
相关文章:
- 如何从 std::vector 搜索和返回项目
- C++二叉搜索树模板从函数返回节点
- 返回不需要的值的二叉搜索程序
- Glob 搜索目录也会返回文件
- 在对象数组中搜索字符串并返回相应值的函数
- 查找存储在二叉搜索树的所有非叶子中的数据总和?(返回整数的独立递归函数
- 对于具有引用返回类型的搜索算法,默认返回值应该是什么?
- 返回二叉搜索树特定级别的节点数的函数
- 快速搜索链表未编译,需要返回语句
- 按扩展名过滤搜索文件会返回太多结果
- 如何使用二叉搜索返回姓氏(给定字符串)的第一个索引/出现次数?
- 二叉搜索功能始终返回 -1 值而不是索引
- C/C++ 从根位置搜索文件夹并返回绝对路径
- 搜索文本文件并返回等号后的值
- 返回 std::p air<const CustomClass &, bool> 用于搜索函数中的失败情况,当 CustomClass 是抽象基类时
- 这个树搜索功能让我发疯.它返回 NULL,但不知何故主函数中的值发生了变化
- 按属性搜索对象的向量并返回迭代器
- 在{8,4,6,2}中搜索4时,std::binary_search是否有任何实现将返回true
- 数组中的线性搜索返回意外结果
- 时间在二叉搜索树中返回 0