C:二叉树搜索方法

时间:2012-05-15 13:53:49

标签: c recursion


我尝试使用递归函数使用二叉树(不,它不是二叉搜索树,只是二叉树)来创建搜索方法。如果数据在二叉树上,我希望它返回节点,如果不是,我希望它返回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看到了二叉树的教程,使用并更改了一些代码,但它仍然是相同的。我正拼命寻求帮助:(

4 个答案:

答案 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。他们永远不会共享一个相同的位置,并假设平均分配每个点都将被采用。