这里有一个通用的算法来检查二进制树的深度: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)'。 –