Как может работать эта рекурсивная функция? - PullRequest
0 голосов
/ 13 августа 2010

Я не могу понять, как это работает, на мой взгляд, как только он добирается до ответа, он ничего не делает с ним.

Node* FindNode(Node *rootNode, int data)
 {
  if (!rootNode)
   return NULL;
  else
  {
   if (rootNode->data == data)
    return rootNode;
   else
   {
    FindNode(rootNode->left, data);
    FindNode(rootNode->right, data);
   }
  }  
 }

Ответы [ 2 ]

10 голосов
/ 13 августа 2010

Это не так.Это должно быть:

Node* FindNode(Node *rootNode, int data) {
    if (!rootNode) {
        return NULL;
    }else if (rootNode->data == data) {
        return rootNode;
    }else if (data < rootNode->data) {
        return FindNode(rootNode->left, data);
    }else{
        return FindNode(rootNode->right, data);
    }
 }

Обратите внимание на дополнительные операторы возврата и дополнительное предложение else if.

РЕДАКТИРОВАТЬ - Суммировать комментарии ниже: ЕдинственноеПричина того, что код, который вы опубликовали, может работать, заключается в том, что странная комбинация деталей реализации компилятора и тестовых данных сошлась в вашу пользу.Вы должны определенно решить проблему, а не сохранять код таким, каким он был.

0 голосов
/ 13 августа 2010

Предполагается, что FindNode возвращается при первом совпадении.

   Node* FindNode(Node *rootNode, int data)
    { 
       Node *ptr;
       if (!rootNode) 
          return NULL; 
       else 
       { 
          if (rootNode->data == data) 
             return rootNode; 
          else 
          {
             ptr = NULL;
             // if either left or right child is there
             if(rootNode->left || rootNode->right)
             { 
                // if not found in left subtree
                if(NULL == (ptr = FindNode(rootNode->left, data))){
                   // check in right subtree
                   ptr = FindNode(rootNode->right, data);
                }
             }
             return ptr;
          }   
       }
    }
...