为什么这个树函数给我"status_access_violation"?

Why does this tree function give me "status_access_violation"?

我正在尝试创建一个函数来判断一棵树是否为 "complete",所以基本上如果每个子树都以两片叶子结尾并且没有空子树。但是当我 运行 代码时,我得到以下错误:

[main] C:\Users\GIT\Desktop\dev\a.exe 1000 (0) handle_exceptions: Exception: STA
TUS_ACCESS_VIOLATION
[main] a 1000 (0) handle_exceptions: Dumping stack trace to a.exe.core

我应该怎么做才能解决这个问题?这是代码:

struct Tree {

    int n;
    Tree *left,*right;

    Tree(): left(NULL),right(NULL) {}

};


bool isFoglia(Tree* root) {
return root->right == NULL && root->left == NULL;
}

bool isMinimum(Tree* root) {
    return isFoglia(root->right) && isFoglia(root->left);
}   

bool isCompleto(Tree* root) {
    if(root == NULL || isFoglia(root) || isMinimum(root)) return 1;
    if(isFoglia(root->right) && root->left == NULL) return 0;
    if(isFoglia(root->left) && root->right == NULL) return 0;
    return isCompleto(root->right) && isCompleto(root->left);
}

编辑:当我尝试 运行 这个告诉树的最大总和的函数时,我遇到了同样的错误,你可以从顶部到底部对其元素求和,每次选择哪个子树去:

int maxSum(Tree *root) {// max is an int function that returns the a if a>=b or b if b>a
    if(isMinimum(root)) {
        return max(root->n+root->right->n,root->n+root->left->n);
    }
    else {
        return max(root->n+maxSum(root->right),root->n+maxSum(root->left));
    }
}

例如,考虑一棵严重不平衡的树,它是一个链表,即

           o
          / \
         /   NULL
        o
       / \
      /  NULL
     o
    / \
NULL  NULL

并且 运行 这在根节点上。

然后:

// root is not NULL, isFoglia(root) is not true, so we descend into
// isMinimum(root)
if(root == NULL || isFoglia(root) || isMinimum(root)) return 1;

于是在isMinimum(root),

return isFoglia(root->right) && isFoglia(root->left);

下降到 isFoglia(root->right),即 isFoglia(nullptr),最终

return root->right == NULL && root->left == NULL;

尝试获取空指针的 leftright 成员。

事实上,这种情况发生在任何有左 child 但没有右的节点,再往下,

if(isFoglia(root->left) && root->right == NULL) return 0;

对具有右 child 但没有左节点的节点表现出相同的问题。一个简单的修复方法是使 isFoglia 可以在空指针上安全调用,例如

bool isFoglia(Tree* root) {
  return root != NULL && (root->right == NULL && root->left == NULL);
}