这个函数的目的是搜索一个节点,如果没有找到则返回 0,如果找到则返回 1。从一些测试来看,即使找到了,它每次仍然返回0,除非该节点是根节点。有人可以解释为什么我的代码是错误的吗?
在 main 中,我设置了一个变量 = search,如果变量 = 1,则打印存在,如果变量 = 0,则打印不存在。
我测试它的是 3 和 4 的 bst。我测试了 bst 并且知道它设置正确
如果我搜索 3,计数器返回 1 并且存在主要打印内容。 如果我搜索 4,我认为会发生的情况是它仍然转到 if (root->data == value) 语句并将计数器设置为 1 并返回它。然而,它不是返回到 main,而是转到底部的返回计数器(等于 0)并将其返回到 main,使其打印不存在,即使它在那里。有人可以一步一步地告诉我这段代码中到底发生了什么以及为什么,以及如何让它返回 1 返回到 main 吗?
int search(struct Node* root, int value){
int counter = 0;
if (root->data == value){
counter = 1;
return counter;
} if (root == NULL){
return counter;
}
if (value < root-> data){
search(root->left, value);
}
else if (value > root->data){
search(root->right, value);
}
return counter;
}
编辑:我还尝试将其转换为 void 函数,如果找到节点,它不会返回,而是打印“present”。有没有办法让它只在使用这种方式时打印一次?
最佳答案
当你在根节点上调用 search()
时,如果所需的值不在根节点中而是在右子树中,则 search(root->right, value)
应该返回 1。但即使这样做,你的函数仍然会返回 0。(检查一下:从调用 search(root->right, value)
的行开始,假设返回 1 并跟踪函数的其余部分,您将看到它返回 0。)
为了解决这个问题,您需要检查 search(root->right, value)
的返回值,是否为 1(表明在右子树中找到了该值) ,您的函数需要做出相应的行为。与 search(root->left, value)
的返回值类似。
关于有人可以解释我的代码的作用/如何修复它(在 bst 中搜索节点)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52809529/