c++:几乎相同的输入,但第二次调用显示段错误 我一直是C开发人员,试图刷新我以前的C++知识。 我不知道为什么第二个IsBalancedroot调用的根地址变成0x0。 当然,这个问题对于大多数C++开发者来说是非常明显的。请给我一些提示

c++:几乎相同的输入,但第二次调用显示段错误 我一直是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

结果是: 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;
}

这条线就是罪魁祸首

    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中那样进行调试。