以递归方式搜索bst以获取非键值

时间:2013-04-22 14:18:38

标签: c search recursion binary-search-tree

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

使用下面的函数时,将进行调用,直到找到匹配项或到达树的末尾,并且无论匹配项如何都返回最左侧的节点。

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

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;

}

2 个答案:

答案 0 :(得分:2)

第一个:

if (ptr == NULL) return ;

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

第二个:

find(ptr->right, str);

您不使用返回值,因此无论如何结果都是错误的。

第三个:

return;

与第一个相同。

如果你要修复所有这些,它应该可以工作。

BTW if (ptr->left != NULL)不是必需的,因为您在功能开头检查ptr == 0

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

答案 1 :(得分:1)

如果left-subtree find返回非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);
}