我遇到了这个问题的麻烦。如何搜索整个树(因为我不能依赖任何订单搜索)并且只返回一个匹配值(如果存在)?如果我返回递归调用,一旦它到达第一个叶子并且没有找到匹配,它是否会失败?
使用下面的函数时,将进行调用,直到找到匹配项或到达树的末尾,并且无论匹配项如何都返回最左侧的节点。
我的递归函数,按顺序遍历:
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;
}
答案 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);
}