繁体   English   中英

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

[英]binary tree recursively search c code [not Binary Search 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';
    }
}

也许像这样

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;
}

那就对了。 尝试这个:

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;
    }
}
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);
}

注意:两者|| ?:使用短路评估,这使我可以将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);
}
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 检查此问题以获取更多详细信息-NULL,'\\ 0'和0之间有什么区别

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM