簡體   English   中英

如何創建 c++ 遞歸 function 以返回節點自定義 object?

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

你好嗎?

我創建了一個 C++ 遞歸 function 以便遍歷二叉樹並打印出屬性COMPLETED = TRUE的所有節點;

它工作得很好,因為 function 的類型是 VOID,我只是打印出結果。

這是工作正常的方式:

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

但我想做的是返回第一個找到的“COMPLETED”節點,而不僅僅是打印!

我嘗試過這種方式但沒有用:

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

您似乎不熟悉返回值的工作原理。 線條的結果

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

在您的代碼中被忽略。 只有在第一次遞歸中的輸入完成的情況下,才會返回任何內容。 坦率地說,我想知道為什么您的編譯器沒有警告您。

我認為您的錯誤是您假設遞歸調用中的返回會導致原始調用也返回。 它沒有。 它產生一個值,然后被忽略。
看下面的代碼:

int four()
{
    return 4;
}

int three()
{
    four();

    return 3;
}

當您調用three()時,這里發生的情況是創建了一個值為 4 的 integer,然后丟棄,然后返回值 3。 three()返回 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;
}

在這里,我將遞歸調用的返回值存儲在變量node中,並在它不是 null 指針的情況下返回它,使用 null 指針作為“未找到”。
如果當前節點既不完整,也沒有在遞歸調用中找到任何內容,我因此返回 null 指針。

您可以將其縮短為

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

你 go 與

    if (not lastNode){
        return nullptr;
    }

或者

    if (lastNode == nullptr){

為了明確我們使用指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM