BST搜索功能在一台机器上返回true而在另一台机器上返回false

时间:2015-03-30 23:21:24

标签: c++ g++ binary-search-tree

我有一个BST程序,这是我的搜索功能,如果在节点中找到指定的数据(d),则返回true。调用它时,node * s指向树的根节点。

当我在大学的虚拟机上编译它时,这个程序工作得很好,但是当我编译并在我的macbook上运行它时返回false。什么会导致完全不同的输出?我添加了一行来打印出搜索时经过的每个节点的数据,并找到具有正确数据的节点,但仍然返回false。

我很感激任何帮助,我想不出这个函数会在不同编译器下破解的原因。

这是关于我的mac编译器的信息

Apple LLVM 6.0版(clang-600.0.57)(基于LLVM 3.5svn) 目标:x86_64-apple-darwin14.1.0 线程模型:posix

这是我的虚拟机编译器上的信息

g ++(Ubuntu / Linaro 4.6.3-1ubuntu5)4.6.3

这是我的BST搜索功能:

  bool bst::search(int d, node *s){
  cout << s->data << endl;
  if(s->data == d){
    curRoot = s;
    return 1;
  }
  else if(d > s->data){
    if(s->right == NULL)
      return 0;
    else{
      if(s->right->data == d)
        pRoot = s;
      search(d,s->right);
    }
  }
  else{
    if(s->left == NULL)
      return 0;
    else{
      if(s->left->data == d)
        pRoot = s;
      search(d,s->left);
    }
  } 
}

2 个答案:

答案 0 :(得分:1)

您当前的功能有几个问题/冗余。 首先,您需要将递归函数search()的值直接返回到堆栈的顶部。

冗余是多个NULL检查,多个数据相等性检查的形式。 用于此目的的函数的浓缩形式如下 -

bool bst::search(int d, node *s){
   if(s == NULL) {
      return 0;
   }

   if(s->data == d) {
      return 1;
   }

   if(d > s->data) {
      return search(d,s->right);
   }
   else {
      return search(d,s->left);
   }
}

答案 1 :(得分:1)

您似乎认为搜索功能应该只返回一次......这确实是迭代实现应该如何。因此,让我们根据sray的简化来看一个。

bool bst::search(int d, const node *s)
{
   while (s) {
      if(s->data == d) return 1;

      if(d > s->data) {
         s = s->right;
      }
      else {
         s = s->left;
      }
   }
   return 0;
}

这是可能的,因为递归是尾递归的 - 我们只需要替换参数并循环。

递归本身不起作用。它就像任何其他函数调用一样工作。如果您在函数内部调用sqrt,则不会认为sqrt会替换您的函数,而是会在计算中使用结果。当你调用自己的函数时也一样。有时需要使用递归结果进行进一步计算。考虑此函数来计算树中的节点:

bool count(const node *s)
{
   if (s)
      return count(s->left) + 1 + count(s->right);
   return 0;
}

让最深的调用设置整个树的返回值对你没有好处。