2015-10-01 63 views
-3

這裏有一個通用的算法來檢查二進制樹的深度:C++檢查,如果一個節點是根二叉樹

int maxDepth(TreeNode* root) { 

    if(root){ 

     return 1 + max(maxDepth(root->left), maxDepth(root->right)); 

    } 

如何進行if(root)條件的工作?

我假設它的意思是if(root = a value of type root)但我不確定如何在其他情況下使用它。

+6

閱讀教程,在此解釋布爾上下文中指針值的使用。 –

+0

謝謝,你有什麼建議嗎? – timothyylim

+1

'if(root)'等同於'if(root!= nullptr)'。 –

回答

1

您顯示這一點,並問:

這裏有一個通用的算法來檢查二進制樹的深度: INT MAXDEPTH(樹節點*根){

if(root){ 
    return 1 + max(maxDepth(root->left), maxDepth(root->right)); 
} 

如何if(root)條件是否工作?

我假設它意味着如果(root =一個類型爲root的值),但不確定如何在其他情況下使用它。

讓我們看看if(root)這裏的變量根函數定義爲指針變量爲TreeNode對象中定義。當一個人調用這個函數時,他們依次傳遞一個指向TreeNode的指針。 if()語句是檢查這是否是「有效」的指針。因此它會檢查root這個指向TreeNode對象的指針的值是否具有存儲在此變量中的有效內存地址。如果內存地址無效,則返回false,否則返回true,並執行此if語句範圍內的代碼。

換句話說聲明:

return 1 + max(maxDepth(root->left), maxDepth(root->right)); 

如果root是一個有效的內存地址有效的指針纔會發生,否則將跳過這個if語句。

你最後的假設是不正確的。這不是有效類型的檢查。這是檢查指針本身是否有效。

編輯

我也想指出,即使root是有效的,這並不意味着存儲在這個變量的實際內存地址是100%的地址到實際TreeNode對象,它只驗證它是有效的。發現這種性質的情況並不常見,但在某些情況下外部代碼正在做其他工作時,可能會發生一些未定義的行爲,並將有效的內存地址分配給此變量,其中分配了內存地址不是你期待的那個。

內存地址無效的例子是-1或最大可能的無符號整型值。這會導致if(root)檢查失敗並跳過該語句。內存地址通常以十六進制數字引用,因此如果您期望TreeNode對象位於0x000000AA - 0x000000FF的範圍內,並且實際存儲在root中的內存地址超出了此界限,如果檢查仍會通過並執行將繼續進入聲明的範圍,因爲即使該聲明不是您期望的內存地址,該指針仍然被認爲對有效的內存地址有效。那麼這就是你可能會在堆上發生損壞,未處理的異常,未定義的行爲或其他類型的錯誤或崩潰的地方。這只是在處理原始指針時要注意的事情。

3

條件root如果是root != NULL則爲true,如果爲root == NULL則爲false。

其他使用它的一個例子:檢查fopen

#include <cstdio> 

int main(void) { 
    FILE *fp; 
    fp = fopen("hoge", "r"); 
    if (fp) { 
     // successfully opened the file 
     fclose(fp); 
    } else { 
     // failed to open the file 
    } 
    return 0; 
} 
+1

將'nullptr'優先於'NULL'。 – Jarod42

2
if(root) 

返回值是相同的話說

if(root != nullptr) 

if(root != NULL) 

if(root != 0) 

這是在嘗試使用它之前確保root包含有效地址的一種方法。

它在這個特定的例子中是當它到達一個空節點時停止遍歷一個分支。所以if語句中的代碼只有在root不爲空時纔會被執行。