我有一个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);
}
}
}
答案 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;
}
让最深的调用设置整个树的返回值对你没有好处。