BST 搜索函数 returns 在一台机器上为真,在另一台机器上为假
BST search function returns true on one machine and false on another
我有一个 BST 程序,这是我的搜索功能,如果在节点中找到指定的数据 (d),则 returns 为真。调用时node *s指向树的根节点。
当我在我大学的虚拟 machine 上编译这个程序时,它工作得很好,但是当我编译时 returns 错误,并且 运行 它在我的 mac 书上。什么会导致完全不同的输出?我加了一行,打印出它搜索时经过的每个节点的数据,它找到了数据正确的节点,但还是returns false.
非常感谢任何帮助,我想不出为什么这个函数会在不同的编译器下崩溃的原因。
这是关于我的mac编译器
的信息
Apple LLVM 版本 6.0 (clang-600.0.57)(基于 LLVM 3.5svn)
目标:x86_64-apple-darwin14.1.0
线程模型:posix
这是我的虚拟machine编译器
上的信息
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);
}
}
}
您当前的函数中有几个problems/redundancies。
首先,您需要 return 将递归函数 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);
}
}
您似乎认为搜索功能应该 return 仅一次...这确实是迭代实现的方式。那么我们来看一个,基于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;
}
让最深的调用为整棵树设置 return 值对你没有好处。
我有一个 BST 程序,这是我的搜索功能,如果在节点中找到指定的数据 (d),则 returns 为真。调用时node *s指向树的根节点。
当我在我大学的虚拟 machine 上编译这个程序时,它工作得很好,但是当我编译时 returns 错误,并且 运行 它在我的 mac 书上。什么会导致完全不同的输出?我加了一行,打印出它搜索时经过的每个节点的数据,它找到了数据正确的节点,但还是returns false.
非常感谢任何帮助,我想不出为什么这个函数会在不同的编译器下崩溃的原因。
这是关于我的mac编译器
的信息Apple LLVM 版本 6.0 (clang-600.0.57)(基于 LLVM 3.5svn) 目标:x86_64-apple-darwin14.1.0 线程模型:posix
这是我的虚拟machine编译器
上的信息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);
}
}
}
您当前的函数中有几个problems/redundancies。 首先,您需要 return 将递归函数 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);
}
}
您似乎认为搜索功能应该 return 仅一次...这确实是迭代实现的方式。那么我们来看一个,基于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;
}
让最深的调用为整棵树设置 return 值对你没有好处。