c ++:几乎相同的输入,但第二次调用显示段故障

时间:2014-10-09 04:29:22

标签: c++

我很长一段时间以来一直是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;
}

3 个答案:

答案 0 :(得分:0)

这条线是罪魁祸首。

    if(IsBalanced(*node.left) && IsBalanced(*node.right))

在解除引用之前,您没有检查node.leftnode.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 = Nullnode.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上。

您可以通过单步执行代码来快速找到它。