对于一个赋值,我应该想出一个名为all_less
的递归函数,它带有一个指向任意任意树(TN<T>*
)和一个{{的指针1}}参数。如果所有值都小于T参数,则返回true,否则返回false。
我的T
类的实例变量是:
Tree
T value;
TN<T>* left;
TN<T>* right;
的函数原型如下所示:
all_less
由于我必须考虑一个未排序的二叉树,我想通过递归方式查看每个子树并检查每个值是否正常。测试完这个功能后:
template<class T>
bool all_less(TN<T>* t, T v)
在函数问题几乎总是返回true之后,我在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;
}
和return true
之前放了一些打印语句,看看发生了什么。
作为一个例子,假设我们在二叉树中有值12,15,14,5。使用:
运行我的功能return false
作为输入,将输出:
TN<int>* t;
std::cout << all_less(t, 15);
最终结果将结束,即使返回false一次也是如此。如何获取它,如果它返回false,该函数返回false并立即停止?还有更好的方法来实现这个功能吗?我最初有一些额外的if-else语句来检查右/左子树是否为空并从那里继续,但那些似乎没有做任何事情。
答案 0 :(得分:2)
您忽略了递归调用的返回值。
最终结果将为真,即使返回了一次false。
false
从另一个函数调用中返回,并且已经消失在天空中的伟大bitbucket中。
递归函数的工作方式与任何其他函数完全相同 - 如果你有
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));
}
答案 1 :(得分:0)
你的职能:
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;
}
P.S。未经测试的代码。