我正在尝试创建一个函数来告诉树是否“完整”,所以基本上如果每个子树以两个叶子结束并且没有无效子树。但是当我运行代码时,我收到以下错误:
[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));
}
}
答案 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;
尝试获取空指针的left
和right
成员。
事实上,这种情况发生在任何一个有左子女但没有正确的孩子的节点上,而且更进一步,
if(isFoglia(root->left) && root->right == NULL) return 0;
对于具有正确子节点但不具有左子节点的节点表现出相同的问题。一个简单的解决方法是使isFoglia
在空指针上安全地可调用,例如
bool isFoglia(Tree* root) {
return root != NULL && (root->right == NULL && root->left == NULL);
}