1

我寫了這個遞歸函數,它按預期工作。它驗證二叉樹,即它檢查給定的二叉樹是否是二叉搜索樹,並且也給出正確的答案。驗證二叉樹的小問題

不過,我得到一個編譯器警告說:

Control may reach end of non-void function 

我不知道這是什麼錯誤是指:函數返回一個bool並不僅僅是脫落的功能結束。我只是不知道如何克服它,因爲它返回bool

我試圖尋找一些我可能在遞歸時忽略的東西,但無濟於事。

bool isBSTRecursively(Node * root){ 
    if (!root) { 
     return true; 
    }else if (!root->getLeft() && !root->getRight()){ 
     return true; 
    }else if(!root->getLeft()){ 
     if (root->getRight()->getData() > root->getData()) { 
      return isBSTRecursively(root->getRight()); 
     } 
    }else if (!root->getRight()){ 
     if (root->getLeft()->getData() < root->getData()) { 
      return isBSTRecursively(root->getLeft()); 
     } 
    }else{ 
     return (isBSTRecursively(root->getLeft()) && isBSTRecursively(root->getRight())); 
    } 
} 
+1

非唯一數據如何?我的意思是,一個節點及其兩個子節點(或兩者)中的任何一個可能具有與節點中相同的數據,並且不會違反樹的分類。你的代碼是否處理這種情況? – 2013-03-24 07:55:49

+1

另外,怎麼樣循環,讓你的樹形圖?你也想檢查一下嗎? – 2013-03-24 07:56:41

+0

@AlexeyFrunze,你是對的。感謝您引起我的注意。我也會嘗試納入這些條件。 – totjammykd 2013-03-24 08:11:46

回答

2

在這些部分:

}else if(!root->getLeft()){ 
    if (root->getRight()->getData() > root->getData()) { 
     return isBSTRecursively(root->getRight()); 
    } 
}else if (!root->getRight()){ 
    if (root->getLeft()->getData() < root->getData()) { 
     return isBSTRecursively(root->getLeft()); 
    } 

請注意,您只有在這裏有兩個特定情況下返回?這就是警告告訴你的,代碼可以採用的路徑沒有明確包含帶有值的return。這可能會導致奇怪的問題,如果你遇到一個案例,當你的代碼沒有這樣做明確return

消除警告的最簡單方法是在函數的末尾添加一個return false

+0

謝謝你的明確解釋。現在它工作正常。 – totjammykd 2013-03-24 07:35:58

2

你寫了一個函數,在所有真正的選項上返回true,但沒有返回false。

它看起來像最後返回false將是正確的結果以及修復警告。