【问题标题】:recursively searching bst for non-key value递归搜索 bst 的非键值
【发布时间】:2013-04-15 11:50:39
【问题描述】:

我在这个逻辑上遇到了麻烦。如何搜索整个树(因为我不能依赖任何订单搜索)并且只返回一个匹配值(如果存在)?如果我返回递归调用,一旦它到达第一片叶子并且没有找到匹配项,它会不会失败?

使用下面的函数时,会一直调用直到找到匹配项或到达树的末尾,无论匹配项如何,都会返回最左边的节点。

我的递归函数,按顺序遍历:

tnode *find(tnode *ptr, const char *str)
{
    if (ptr == NULL) return ;

    if(strcmp (str,ptr->str) == 0)
        return ptr;


    else 
    {
        //search left subtree
        if (ptr->left != NULL)
            find(ptr->left, str) ;


        // search right subtree
        if (ptr->right != NULL)
            find(ptr->right, str) ;
    }

   return;

}

【问题讨论】:

    标签: c search recursion binary-search-tree


    【解决方案1】:

    第一个:

    if (ptr == NULL) return ;
    

    你应该根据函数原型(tnode *find(tnode *ptr, const char *str))返回一个值。

    第二个:

    find(ptr->right, str);
    

    你没有使用返回值,所以无论如何结果都会不正确。

    第三个:

    return;
    

    和第一个一样。

    如果你能解决所有问题,它应该可以工作。

    顺便说一句,if (ptr->left != NULL) 不是必需的,因为您在函数开头检查了ptr == 0

    最后一个请注意编译器警告

    【讨论】:

    • 没有空检查我得到一个抛出的异常(访问冲突读取 0xcccccccc)
    • @user2081737 似乎有点奇怪,因为无论如何0xcccccccc 不是NULL。你确定你正确地填充了树吗?
    • 我一定是做错了什么蠢事,现在我再试一次它就可以了。
    • @user2081737 ,如果你没有正确填充指针,那么你会得到未定义的行为,所以不能保证下次程序可以工作。
    【解决方案2】:

    如果左子树查找返回非 NULL,则您有一个匹配项并且应该返回它。目前,您甚至都不看它是否找到任何东西。

    如果它没有找到任何东西,你可以返回右子树查找的结果(如果它是 NULL,你到处找都没有找到)。

    tnode *find(tnode *ptr, const char *str)
    {
        ptr *found;
    
        if (ptr == NULL) return NULL; /* nothing to see here */
    
        if(strcmp (str,ptr->str) == 0)
            return ptr; /* it is here! */
    
        /* try left subtree */
        found = find(ptr->left, str);
        if (found) return found; /* it was on the left */
    
        /* try right subtree */
        return find(ptr->right, str);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-05-28
      • 2016-11-22
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-30
      • 2011-04-27
      相关资源
      最近更新 更多