为什么这个树功能给了我" status_access_violation"?

时间:2015-03-01 10:41:23

标签: c++ tree

我正在尝试创建一个函数来告诉树是否“完整”,所以基本上如果每个子树以两个叶子结束并且没有无效子树。但是当我运行代码时,我收到以下错误:

[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));
    }
}

1 个答案:

答案 0 :(得分:2)

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

           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成员。

事实上,这种情况发生在任何一个有左子女但没有正确的孩子的节点上,而且更进一步,

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

对于具有正确子节点但不具有左子节点的节点表现出相同的问题。一个简单的解决方法是使isFoglia在空指针上安全地可调用,例如

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