为什么这个树函数给我"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;
尝试获取空指针的 left
和 right
成员。
事实上,这种情况发生在任何有左 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);
}
我正在尝试创建一个函数来判断一棵树是否为 "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;
尝试获取空指针的 left
和 right
成员。
事实上,这种情况发生在任何有左 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);
}