這裏有一個通用的算法來檢查二進制樹的深度: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)
但我不確定如何在其他情況下使用它。
這裏有一個通用的算法來檢查二進制樹的深度: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)
但我不確定如何在其他情況下使用它。
您顯示這一點,並問:
這裏有一個通用的算法來檢查二進制樹的深度: 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
中的內存地址超出了此界限,如果檢查仍會通過並執行將繼續進入聲明的範圍,因爲即使該聲明不是您期望的內存地址,該指針仍然被認爲對有效的內存地址有效。那麼這就是你可能會在堆上發生損壞,未處理的異常,未定義的行爲或其他類型的錯誤或崩潰的地方。這只是在處理原始指針時要注意的事情。
條件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;
}
將'nullptr'優先於'NULL'。 – Jarod42
if(root)
返回值是相同的話說
if(root != nullptr)
或
if(root != NULL)
或
if(root != 0)
這是在嘗試使用它之前確保root包含有效地址的一種方法。
它在這個特定的例子中是當它到達一個空節點時停止遍歷一個分支。所以if語句中的代碼只有在root不爲空時纔會被執行。
閱讀教程,在此解釋布爾上下文中指針值的使用。 –
謝謝,你有什麼建議嗎? – timothyylim
'if(root)'等同於'if(root!= nullptr)'。 –