2013-07-27 95 views
0

另一個遞歸問題,對不起,只是無法讓我的頭轉過來。我試圖返回一個節點指針,其id與提供的id相匹配。我想我正確地遍歷樹。任何想法,我在這裏錯了嗎?從遞歸函數中返回一個值

//h 
Node* findNode(const QString &id, Node *node=NULL) 

//cpp 
Node* Tree::findNode(const QString &id, Node *node) 
{ 
    if (node == NULL) 
     node = root; 

    for(int i = 0, end = node ? node->childCount() : -1; i < end ; i++) 
    { 
     QString nodeId = node->child(i)->id(); 

     if (nodeId == id) 
     { 
      return node; 
     } 
     else 
     { 
      return findNode(id, node->child(i)); 
     } 
    } 
} 

感謝您尋找

回答

3

我敢肯定你需要的東西,如:

... 
else 
{ 
    Node *temp = findNode(id, node->child(i)); 
    if (temp) return temp; 
} 

由於它是,它返回它達到你的循環結束之前。

此外,您還需要返回NULL(或更好,但nullptr)在你的函數的末尾:

// At the end 
return NULL; 
+0

謝謝大家。 Mats,在else子句中,節點ID與所需的ID不匹配,爲什麼我需要返回節點? – dogsbollocks

+0

'return temp;'是要替換'return findNode(...)' - 這意味着你找到了你正在尋找的子節點。顯然,如果'temp'是NULL,你需要繼續尋找。在你的原始代碼中,你總是在這個時候返回,所以你從來沒有把所有的節點看成一個特定的級別 - 這顯然是錯誤的。但是如果你發現了某些東西,你就不想繼續尋找,所以如果你有的話就回來。 –

4

else,只能從遞歸調用如果事情被發現返回值。否則,你永遠不會過去i=0

1
else return findNode(id, node->child(i));` 

這將導致第一子樹(子)遍歷只。

我寧願寫這樣的東西,以便遍歷所有子樹,直到找到東西。如果發現什麼都沒有,返回nullptr

Node *find(Node *tree, string id) 
{ 
    if (tree->id == id) 
     return tree; 

    Node *ptr = nullptr; 
    for (int i = 0; i < tree->childCount; i++) 
     if ((ptr = find(node->children[i], id)) != nullptr) 
      return ptr; 

    return nullptr; 
} 
0

你似乎做的只是一個深度優先搜索,並返回最左邊的葉節點的結果。

在findNode(id,node-> child(i));你永遠不會檢查這是否返回NULL。

如果孩子的返回值不是NULL(實際上發現了某些內容),那麼只返回那裏,否則繼續循環(現在只看第一個元素)。

然後,在循環之後,如果沒有發現任何東西(沒有返回),則返回NULL。