0

私のコードの問題は、左の子の値が検索されると、再帰レベルが原因で戻って右の子をチェックすることです.そして、戻り値が正しくない. 私はそれを乗り越える方法を見つけることができません。

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

4 に答える 4

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;
}
于 2013-04-21T07:53:25.290 に答える
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;
    }
}
于 2013-04-21T07:52:45.643 に答える
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);
}

注: 両方とも短絡||評価を?:使用します。これにより、条件の数を 1 つに減らすことができます。if(...)

更新:「不自由な三項」演算子 gnu 拡張の使用が許可されている場合は、変数を回避することもできます。

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);
}
于 2013-04-21T11:26:30.480 に答える
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この場合の使用は避けてください。\0null 文字に使用されます。NULLNULL ポインターに使用されます。どちらも通常は 0 ですが、NULLポインターに使用することをお勧めします。詳細については、この質問を確認してください - NULL、「\ 0」、および 0 の違いは何ですか

于 2013-04-21T07:52:38.983 に答える