C ++检查节点是否是二叉树中的根

时间:2015-10-01 15:22:01

标签: 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)但不确定如何在其他情况下使用它。

3 个答案:

答案 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}}中的内存地址超出该范围如果检查仍然通过并且执行将继续进入语句的范围,因为该指针仍然被认为对有效的内存地址有效,即使它不是您期望的那个。然后,您可能会在堆上出现损坏,未处理的异常,未定义的行为或其他类型的错误或崩溃。在使用原始指针时,这只是需要注意的事项。