这是检查二叉树深度的通用算法:
int maxDepth(TreeNode* root) {
if(root){
return 1 + max( maxDepth(root->left), maxDepth(root->right));
}
if(root)
条件如何运作?
我假设它意味着if(root = a value of type root)
但不确定如何在其他情况下使用它。
答案 0 :(得分:3)
条件root
如果root != NULL
则为真,如果root == NULL
则为假。
其他用法示例:检查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 :(得分:2)
if(root)
与说
相同if(root != nullptr)
或
if(root != NULL)
或
if(root != 0)
在尝试使用root之前,确保root包含有效地址是一种方法。
它在这个具体示例中的作用是在分支到达空节点时停止遍历。因此,只有在root不为空时才会执行if语句中的代码。
答案 2 :(得分:1)
你展示了这个并问:
这是检查二叉树深度的通用算法: int maxDepth(TreeNode * root){
if(root){
return 1 + max( maxDepth(root->left), maxDepth(root->right));
}
if(root)条件如何工作?
我假设它意味着if(root = root类型的值)但不确定如何在其他情况下使用它。
让我们看一下if(root)
这里变量root在函数定义中被定义为TreeNode
对象的指针变量。当一个人调用这个函数时,他们依次传递指向TreeNode
的指针。 if()
语句是检查这是否是“有效”指针。因此,它检查root
的值TreeNode
是否为return 1 + max( maxDepth( root->left), maxDepth( root->right ) );
对象的指针,该值是否存储在此变量中的有效内存地址。如果内存地址无效,则返回false,否则返回true并执行此if语句范围内的代码。
声明中的另一个词:
root
仅当root
是具有有效内存地址的有效指针时才会发生,否则它将跳过此if语句。
你最后的假设是不正确的。这不是有效类型的检查。这是检查指针本身是否有效的检查。
修改强>
我还要注意,即使TreeNode
有效,这并不意味着存储在此变量中的实际内存地址是实际if( root )
对象的100%地址,它只是验证它是否有效。看到这种性质发生的情况并不常见,但在外部代码正在进行其他工作的某些情况下,可能会发生某些未定义的行为,并且为此变量分配了有效的内存地址,其中分配了内存地址不是你期待的那个。
无效的内存地址的示例将是-1或最大可能的无符号int值。这将导致TreeNode
检查失败并跳过该语句。内存地址通常以十六进制数引用,因此如果您希望root
对象位于0x000000AA - 0x000000FF范围内,并且实际存储在{{1}}中的内存地址超出该范围如果检查仍然通过并且执行将继续进入语句的范围,因为该指针仍然被认为对有效的内存地址有效,即使它不是您期望的那个。然后,您可能会在堆上出现损坏,未处理的异常,未定义的行为或其他类型的错误或崩溃。在使用原始指针时,这只是需要注意的事项。