有人可以解释我的代码的作用/如何修复它(在 bst 中搜索节点)吗?

标签 c recursion data-structures binary-search-tree

这个函数的目的是搜索一个节点,如果没有找到则返回 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/

相关文章:

python - 两个字典(键和值)的递归差异?

c - while 中的 if 语句依赖于 while 依赖的同一个变量

使用 Emscripten 在 C 代码中回调 javascript 函数

objective-c - 读取 nsdictionary 与 nsarray 的性能

仅当定义了值时才更新 Python 字典

c - 面向对象的C - 结构中的变量+优点和缺点

c - 这个程序的输出是什么?为什么?

list - 理解 Prolog 列表和递归

java - 用递归实现 Stack 的 Pop 方法

javascript - 使用递归从函数返回数组的最佳方法是什么