它不工作的兩個相等的值;
這裏是一個可能的修復你的代碼:(更新 - 此代碼現在編譯)
總結 - 「decursion」(當遞歸正在瓦解)在你的代碼丟棄結果的最後兩行。
int height_target(node* current, int data, int height)
{
int retVal = 0;
do {
if (nullptr == current)
break; // 0 indicates not found
if (current->info == data) { retVal = height; break; }
// found the node at 'height'; now de-curse
retVal = height_target (current->left, data, height+1);
if (retVal) break; // found data in left branch
retVal = height_target(current->right, data, height+1);
if(retVal) break; // found data in right branch
}while(0);
return retVal;
}
想象你的搜索條目找到5層「上」,使最高遞歸返回5
在層4,數據沒有被發現,那麼你的代碼,然後搜索這兩個左支和右分支。
對於任一分支,當您的代碼返回(來自第5層)的值爲'5'時,您的代碼只會丟棄結果。
在這種可能的解決方案中,我從左側或右側返回後測試了retVal。現在,如果返回值(來自第5層)不爲零,該函數將返回非零值;最終將堆棧中的值從堆棧中彈回到遞歸的底部。
也許簡化呼叫跟蹤可以說明:
height_target (., ., 1); // first call, data not found at root
| height_target (., ., 2); // recursive call, data not found
| | height_target (., ., 3); // recurse, not found
| | | height_target (., ., 4); // recurse, not found
| | | | height_target (., data, 5); // found! 'decursion' begins
| | | | |
| | | | returns 5 // height 5 returns 5
| | | returns 5 // height 4 return 5
| | returns 5 // height 3 returns 5
| returns 5 // height 2 returns 5
returns 5 // height 1 returns 5
首先調用現在返回5
歡迎來到StackOverflow。請閱讀並遵守幫助文檔中的發佈準則。 [最小,完整,可驗證的示例](http://stackoverflow.com/help/mcve)適用於此處。在您發佈代碼並準確描述問題之前,我們無法有效幫助您。 「它不工作」不是一個足夠的問題描述。 – Prune