二叉树递归搜索c代码[不是二进制搜索树]

时间:2013-04-21 07:43:30

标签: c search recursion binary-tree

我的代码的问题在于,当搜索左子值时,由于递归级别,它会返回并检查正确的子级。并且返回不正确。我无法找到一种方法来克服它。

node * search(node *ptr,int key)
{
    if(ptr->data==key)
        return ptr;
    else
    {
        if(ptr->lchild!='\0')
            search(ptr->lchild,key);
        else
            return '\0';
        if(ptr->rchild!='\0')
            search(ptr->rchild,key);
        else
            return '\0';
    }
}

4 个答案:

答案 0 :(得分:4)

也许就像这样

node * search(node *ptr,int key)
{
    node *pwk;
    if(ptr == NULL) return NULL;
    if(ptr->data==key)
        return ptr;
    if(NULL!=(pwk=search(ptr->lchild,key)))
        return pwk;
    if(NULL!=(pwk=search(ptr->rchild,key)))// or return search(ptr->rchild,key);
        return pwk;
    return NULL;
}

答案 1 :(得分:1)

没错。试试这个:

node * search(node *ptr,int key)
{
    if(ptr->data==key)
        return ptr;
    else
    {
        node *current = NULL;
        if(ptr->lchild != NULL)
            current = search(ptr->lchild,key);

        if(current == NULL) /* not found in the left subtree */
        {
            if(ptr->rchild != NULL)
                current = search(ptr->rchild,key);
        }
        return current;
    }
}

答案 2 :(得分:1)

Node *search(Node *ptr, int key)
{
    Node *found;
    if ( !ptr || ptr->data == key) return ptr;

    found = search(ptr->lchild, key);

    return (found) ? found : search(ptr->rchild, key);
}

注意:||?:都使用short circuit评估,这样我就可以将if(...)条件的数量减少到一个。

更新:如果我们被允许使用“残缺三元”运算符gnu-extension,我们也可以避免变量:

Node *search2(Node *ptr, int key)
{
    if ( !ptr || ptr->data == key) return ptr;

    return search2(ptr->lchild, key) ?: search2(ptr->rchild, key);
}

添加另一个三元组会完全删除if(...)

Node *search3(Node *ptr, int key)
{
    return ( !ptr || ptr->data == key) 
        ? ptr
        : search3(ptr->lchild, key) ?: search3(ptr->rchild, key);
}

答案 3 :(得分:0)

node * search(node *ptr,int key)
{
    Node * p;

    // Found the key, return the pointer to the node
    if (ptr->data==key)
        return ptr;

    if (ptr->lchild != NULL)
    {
        p = search(ptr->lchild,key);
        // Found the key, return the pointer to the node
        if(p != NULL)
            return p;
    }
    // Didn't find it in the lchild, so search rchild
    if (ptr->rchild != NULL)
    {
        p = search(ptr->rchild,key);
        // Found the key, return the pointer to the node
        if(p != NULL)
            return p;
    }

    // Not found in left or right child, return NULL
    return NULL;
}

在这种情况下避免使用\0\0用于空字符。 NULL用于空指针。虽然两者通常都是0,但最好使用NULL作为指针。请查看此问题以获取更多详细信息 - What is the difference between NULL, '\0' and 0