2015-01-21 80 views
-3

首先,我並不陌生於C或C++。不過,我目前正在Mac Yosemite上使用C++。我只是試圖編寫一個遞歸函數來返回兩個節點的共同祖先,這些節點由其關鍵(數據)變量標識。邏輯很簡單,遍歷樹直到兩個節點都在同一個分支中,這些節點發散的節點是共同的祖先。有了這個想法,我想出了以下代碼:我的C++代碼有什麼問題?最少見的祖先

Node * commonAncestor(Node *n, int left_elem, int right_elem) 
{ 
    if (n == NULL || n->key()==left_elem || n->key() == right_elem){return NULL;} 
    if (left_elem < n->key() && right_elem > n->key()) {return n;} 
    if (left_elem > n->key() || right_elem < n->key()) { 
     cout<<"\n...Consider changing the order of the elements"<<endl; 
    } 
    if (left_elem < n->key() && right_elem < n->key()) { 
     commonAncestor(n->Left(), left_elem, right_elem); 
    } 
    if (left_elem > n->key() && right_elem > n->key()) { 
     commonAncestor(n->Right(), left_elem, right_elem); 
    } 
} 

我應該工作,我已經完成了類似的計劃。但是,該程序不能編譯。我得到編譯器錯誤"control may reach end of non-void function" 這很奇怪,因爲我有返回語句。另外,爲了避免這個錯誤,我嘗試在最後添加一個返回語句,它只返回根節點。我很困惑...我應該用XCode設置做些什麼嗎?我的邏輯錯了嗎?

+4

難道把在return語句最後修復錯誤? – BWG 2015-01-21 02:47:57

+0

是的,它讓我編譯但不會返回正確的節點。它返回t他根源......在這種情況下。 – 2015-01-21 03:41:20

回答

0

這是因爲返回總是在IF語句中,所以它們可能不會被調用...所以解決方案應該在函數結束時調用return,如果它進入任何IF(帶NULL或值你要)。

1

這是因爲您忘記了返回遞歸調用返回的值。並且在最後添加一個返回NULL,因爲編譯器不一定知道該函數的結尾是不可訪問的。

Node * commonAncestor(Node *n, int left_elem, int right_elem) 
{ 
    if (n == NULL || n->key()==left_elem || n->key() == right_elem){return NULL;} 
    if (left_elem < n->key() && right_elem > n->key()) {return n;} 
    if (left_elem > n->key() || right_elem < n->key()) { 
     cout<<"\n...Consider changing the order of the elements"<<endl; 
     return NULL; 
    } 
    if (left_elem < n->key() && right_elem < n->key()) { 
     return commonAncestor(n->Left(), left_elem, right_elem); 
    } 
    if (left_elem > n->key() && right_elem > n->key()) { 
     return commonAncestor(n->Right(), left_elem, right_elem); 
    } 

    return NULL; 
} 
+0

請閱讀我的整篇文章。正如我在文章中提到的,我也嘗試添加return語句 - NULL。在這種情況下,返回的函數只返回NULL。但是,當我添加cout進行調試時,控制流程似乎很好......! – 2015-01-21 03:43:50

+0

嗯,閱讀我的整個答案:)你是否嘗試在commonAncestor調用前添加return語句,正如我所建議的那樣?另外,對於其中一個節點是另一個節點的祖先的情況,我建議在第一個分支中返回'n'而不是'NULL'。 – Ishamael 2015-01-21 05:18:49

0

編譯器不會高興,除非它是一定會有所作爲,無論返回什麼(即使你的,如果我們以所有可能的情況下照顧。最後,在那裏你假設你的代碼將永遠無法達到,只是拋出一個return NULL;,它會很高興。

而且,我可能是錯的,但我相信你也想回在你的最後兩個IFS遞歸調用commonAncestor結果。

+0

我已經試過返回NULL,在這種情況下,該函數將只返回NULL。 – 2015-01-21 03:44:31