这个递归函数如何工作?

时间:2010-08-13 04:40:54

标签: c++ recursion binary-tree

我无法弄清楚这是如何工作的,在我的脑海中,一旦得到答案它就不会对它做任何事情。

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 个答案:

答案 0 :(得分: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);
    }
 }

请注意额外的return语句和额外的else if子句。

编辑 - 总结以下评论:您发布的代码可能正常工作的唯一原因是编译器实现细节和测试数据的奇怪组合对您有利。你绝对应该解决问题,而不是保持代码的原样。

答案 1 :(得分: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;
          }   
       }
    }