【问题标题】:How Can This Recursive Function Work?这个递归函数如何工作?
【发布时间】:2011-03-29 06:51:32
【问题描述】:

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

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

【问题讨论】:

    标签: c++ recursion binary-tree


    【解决方案1】:

    它没有。应该是:

    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 子句。

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

    【讨论】:

    • 嗯,这就是我的想法……但它可以工作,至少作为更大系统的一部分。
    • 由于您的编译器对return 语句的特定实现,返回值可能会出现在正确的位置;但是,您不能依赖它始终工作。此外,由于您一直在搜索左右子树,因此在数组上使用 BST 并没有任何优势。
    • @Shraptnel:不,它没有。更准确地说,您在原始帖子中发布的内容不起作用。您很可能错误地复制了代码。
    • @David:我发现它非常不可能偶然工作,因为第二个递归调用的结果将覆盖第一个递归调用的结果。它根本行不通。
    • 您假设树是有序的。问题没有具体说明。
    【解决方案2】:

    这是假设 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;
              }   
           }
        }
    

    【讨论】:

      猜你喜欢
      • 2016-11-01
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      相关资源
      最近更新 更多