我尝试使用递归函数使用二叉树(不,它不是二叉搜索树,只是二叉树)来创建搜索方法。如果数据在二叉树上,我希望它返回节点,如果不是,我希望它返回NULL
值。我已经完成了搜索功能,并且完美地完成了它的工作。但问题是,似乎函数不会返回节点。
这里是二叉树的struct
:
struct data
{
int number;
struct data *left, *right;
}*root = NULL;
这是我正在谈论的搜索功能:
data* search(struct data *node, int key)
{
if(node == NULL)
return NULL;
else
{
printf("\n%d %d -", node->number, key);
if(node->number== key)
return node;
search(node->left, key);
search(node->right, key);
}
}
当我调用这样的搜索功能时:search(root, 6);
,虽然我已将NULL
号码推入6
,但它会返回return node;
值二叉树(搜索功能也停在NULL
行,所以我假设函数返回{{1}}。)
我在here看到了二叉树的教程,使用并更改了一些代码,但它仍然是相同的。我正拼命寻求帮助:(
答案 0 :(得分:4)
您的函数将始终返回您的函数对其递归调用的结果不做任何事情;实际上,控制流可能会“落到最后”而不会发出NULL
,除非顶部节点包含密钥。return
声明。
您应该检查递归调用的返回值,并在适当时将其传递出去:
if (node == NULL)
return NULL;
else if (node->number == key)
return node;
else {
data *left = search(node->left, key);
return left? left: search(node->right, key);
}
请注意“三元运算符”(if-then-else表达式)?:
。
答案 1 :(得分:1)
除非您使用search
将其更改为此类内容。
data* search(struct data *node, int key)
{
if(node == NULL)
return NULL;
else
{
printf("\n%d %d -", node->number, key);
if(node->number== key)
return node;
struct data *tmp;
tmp = search(node->left, key);
/* node found ? */
if (tmp)
return tmp;
tmp = search(node->right, key);
/* node found ? */
if (tmp)
return tmp;
}
/* search didn't find anything */
return NULL;
}
答案 2 :(得分:1)
你实际上从来没有实际从递归调用返回结果。
您需要检查这些调用的返回值,如果他们找到了节点,则将其返回
data* search(struct data *node, int key)
{
data* found = NULL;
if(node == NULL)
return NULL;
printf("\n%d %d -", node->number, key);
if(node->number== key)
return node;
found = search(node->left, key);
if (found)
return found;
found = search(node->right, key);
if (found)
return found;
return NULL;
}
答案 3 :(得分:0)
制作二叉树有一种更简单,更有效的方法,而且只需使用矢量/数组。
我是访问你的向量的int。为了正确,我= i * 2。向左走,i = i * 2 + 1。他们永远不会共享一个相同的位置,并假设平均分配每个点都将被采用。