2015-10-01 39 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不为空时才会被执行。