2010-08-13 6 views
0

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

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

ответ

10

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

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 пункта.

EDIT — Резюмируя комментарии ниже: Единственная причина, по которой код размещен мог бы работать, если нечетное сочетание деталей компилятором реализации и тестовых данных сходились в вашу пользу. Вы должны определенно решить проблему, а не сохранить код, как это было.

+0

Ну, это то, что я думал ... но он работает, по крайней мере, как часть более крупной системы. – fauxCoder

+0

Возможно, что возвращаемое значение заканчивается в нужном месте из-за конкретной реализации вашего оператора 'return'; однако вы не можете полагаться на это, всегда работая. Кроме того, поскольку вы всегда искали оба левого и правого поддеревьев, вы не получали никакого преимущества от использования BST над массивом. – David

+0

@ Шрапнель: Нет, нет. Точнее, то, что вы разместили в своем оригинальном посте, не работает. Скорее всего, вы неправильно воспроизвели код. – AnT

0

Предполагается, что 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; 
      } 
     } 
    } 
Смежные вопросы