c++:几乎相同的输入,但第二次调用显示段错误 我一直是C开发人员,试图刷新我以前的C++知识。 我不知道为什么第二个IsBalancedroot调用的根地址变成0x0。 当然,这个问题对于大多数C++开发者来说是非常明显的。请给我一些提示
结果是: 1.是平衡的吗?0 分段错误:11c++:几乎相同的输入,但第二次调用显示段错误 我一直是C开发人员,试图刷新我以前的C++知识。 我不知道为什么第二个IsBalancedroot调用的根地址变成0x0。 当然,这个问题对于大多数C++开发者来说是非常明显的。请给我一些提示,c++,C++,结果是: 1.是平衡的吗?0 分段错误:11 #include <iostream> using namespace std; struct Node { Node* left; Node* right; }; int GetHeight(Node *node) { if(node == NULL) return 0; if(node->left == NULL && node->right == NUL
#include <iostream>
using namespace std;
struct Node {
Node* left;
Node* right;
};
int GetHeight(Node *node) {
if(node == NULL)
return 0;
if(node->left == NULL && node->right == NULL)
return 1;
int leftHeight = GetHeight(node->left);
int rightHeight = GetHeight(node->right);
if(leftHeight > rightHeight)
return 1 + leftHeight;
else
return 1 + rightHeight;
}
bool IsBalanced(Node &node){
int leftHeight = 0;
int rightHeight = 0;
if(node.left == NULL && node.right == NULL)
return true;
if(node.left != NULL)
leftHeight = GetHeight(node.left);
if(node.right != NULL)
rightHeight = GetHeight(node.right);
int diff = leftHeight - rightHeight;
if(diff >= -1 && diff <= 1)
{
if(IsBalanced(*node.left) && IsBalanced(*node.right))
return true;
else
return false;
}
else
return false;
}
int main() {
Node root, n1, n2, n3, n4, n5;
root.left = &n1;
root.right = NULL;
n1.left = &n2;
n1.right = &n3;
n2.left = NULL;
n2.right = NULL;
n3.left = &n4;
n3.right = NULL;
n4.right = &n5;
n4.left = NULL;
n5.right = NULL;
n5.left = NULL;
cout<< "1. Is Balanced? " << IsBalanced(root) << endl;
root.left = &n1;
root.right = &n2;
n1.left = &n3;
n1.right = &n4;
n2.left = &n5;
n2.right = NULL;
n3.left = NULL;
n3.right = NULL;
n4.right = NULL;
n4.left = NULL;
n5.right = NULL;
n5.left = NULL;
cout<< "2. Is Balanced? " << IsBalanced(root) << endl;
return 0;
}
这条线就是罪魁祸首
if(IsBalanced(*node.left) && IsBalanced(*node.right))
在取消引用node.left或node.right之前,您不会检查它们是否为NULL。由于幸运的巧合,第一次迭代成功了
以下是一个适用于我的IsBalanced的更新版本:
bool IsBalanced(Node &node){
int leftHeight = 0;
int rightHeight = 0;
if(node.left == NULL && node.right == NULL)
return true;
if(node.left != NULL)
leftHeight = GetHeight(node.left);
if(node.right != NULL)
rightHeight = GetHeight(node.right);
int diff = leftHeight - rightHeight;
if(diff >= -1 && diff <= 1)
{
if ( node.left == NULL || node.right == NULL )
{
return true;
}
else
{
return (IsBalanced(*node.left) && IsBalanced(*node.right));
}
}
else
return false;
}
一个问题可能是由于get GetHeightnode*节点函数造成的 以node.left=Null和node.right=node2为例 GetHeight函数最终会将node->left传递给递归GetHeight函数,该函数为NULL,然后该GetHeight函数在测试条件时会出错:
if(node->left == NULL && node->right == NULL)
如果只有一个子节点为NULL,则GetHeight应该有单独的案例,您递归调用IsBalanced,在某些情况下传递的节点为NULL。例如,如果一个子项(但不是两个子项)都为NULL,并且diff介于-1和1之间。在第二次调用中,节点2会发生这种情况
您可能可以通过单步执行代码快速找到这一点。您试过调试代码吗?分段错误发生在哪一行?@cdhowie我第一次使用Xcode。因此,我无法像在MS VS IDE中那样进行调试。