对二叉树进行递归搜索,返回true和false

时间:2015-02-02 03:29:16

标签: c++ recursion tree binary-tree

对于一个赋值,我应该想出一个名为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语句来检查右/左子树是否为空并从那里继续,但那些似乎没有做任何事情。

2 个答案:

答案 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。未经测试的代码。