我很长一段时间以来一直是C#开发人员,并尝试刷新我以前的C ++知识。 我不知道为什么第二个IsBalanced(root)调用的“根”地址变为0x0。 当然,这个问题对大多数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 == 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;
}
答案 0 :(得分: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;
}
答案 1 :(得分:0)
一个问题可能是由于您获得GetHeight(node* node)
功能
以案例node.left = Null
和node.right = node2
你的GetHeight函数最终会将node-&gt; left(这是NULL)传递给递归的GetHeight函数,然后在测试条件时,GetHeight函数会出现段错误:
if(node->left == NULL && node->right == NULL)
GetHeight应该有单独的情况,如果只有一个节点子节点为NULL
答案 2 :(得分:0)
您递归调用IsBalanced,在某些情况下传递的节点为NULL。例如,如果一个(但不是两个)子节点都是NULL并且diff在-1和1之间。这在第二次调用中发生在节点2上。
您可以通过单步执行代码来快速找到它。