如何为 return 节点自定义对象创建 C++ 递归函数?

how to create a c++ recursive function to return a node custom object?

你好吗?

我创建了一个 C++ 递归函数以遍历二叉树并打印出 属性 COMPLETED = TRUE;[=13= 的所有节点]

它工作得很好,因为函数的类型是 VOID,我只打印出结果。

这是行之有效的方法:

void findAndPrintFirstCompletedNodes(treeNode *lastNode) {
     if (lastNode == 0){
         return;
     }
     
   if (lastNode->completed == true) {
          cout << lastNode->word.morseWordElement << endl;
   
   }
      findAndPrintFirstCompletedNodes(lastNode->left);
      findAndPrintFirstCompletedNodes(lastNode->right);
   
 }

但我想做的是 return 第一个找到的“已完成” node 而不是打印!

我试过这种方法,但没有用:

treeNode * findAndPrintFirstCompletedNodes(treeNode *lastNode) {
      if (lastNode == 0){
          return 0;
      }
      
    if (lastNode->completed == true) {
           return lastNode;
    
    }
       findAndPrintFirstCompletedNodes(lastNode->left);
       findAndPrintFirstCompletedNodes(lastNode->right);
    
  }

感谢您的帮助。

菲利普

不确定你想要什么,但我怀疑你正在寻找

treeNode * findAndPrintFirstCompletedNodes(treeNode *lastNode) {
  if (lastNode == nullptr){
    return nullptr;
  }
      
  if (lastNode->completed == true) {
    return lastNode;
  }

  auto pnt = findAndPrintFirstCompletedNodes(lastNode->left);

  if ( nullptr == pnt ) {
    pnt = findAndPrintFirstCompletedNodes(lastNode->right);
  }

  return pnt;
}

您似乎不熟悉 returning 值的工作原理。 行的结果

findAndPrintFirstCompletedNodes(lastNode->left);
findAndPrintFirstCompletedNodes(lastNode->right);

在您的代码中被忽略。 只有在第一个递归中输入完成的情况下,任何东西都是returned。坦率地说,我想知道为什么你的编译器没有警告你。

我认为您的错误在于您假设递归调用中的 return 会导致原始调用也为 return。它没有。它产生一个值,然后被忽略。
看下面的代码:

int four()
{
    return 4;
}

int three()
{
    four();

    return 3;
}

当您调用 three() 时,这里发生的事情是创建一个值为 4 的整数,然后丢弃,然后 return 编辑值 3。 three() return 4.

试试这个:

treeNode * findAndPrintFirstCompletedNodes(treeNode *lastNode) {
    if (lastNode == 0){
        return 0;
    }
  
    if (lastNode->completed == true) {
        return lastNode;
    }

   treeNode* node;

   node = findAndPrintFirstCompletedNodes(lastNode->left);
   if(node) return node;

   node = findAndPrintFirstCompletedNodes(lastNode->right);
   if(node) return node;

   return nullptr;
}

在这里,我将递归调用的return值存储在变量node中,并return它以防它不是空指针,使用空指针作为“未找到”。
如果当前节点既不完整也没有在递归调用中找到任何东西,我因此 return 一个空指针。

您可以将其缩短为

treeNode* node;

node = findAndPrintFirstCompletedNodes(lastNode->left);
if(node) return node;

node = findAndPrintFirstCompletedNodes(lastNode->right);
return node;

甚至

treeNode* node = findAndPrintFirstCompletedNodes(lastNode->left);
if(node) return node;

return findAndPrintFirstCompletedNodes(lastNode->right);

但我选择了上面的版本,因为它应该更好地说明这一点。


顺便说一下,我建议用

    if (lastNode == 0){
        return 0;
    }

你一起去

    if (not lastNode){
        return nullptr;
    }

    if (lastNode == nullptr){

为了明确我们使用的是指针。