当前位置: 首页 > 知识库问答 >
问题:

二叉树结构平衡,使用递归时EXC_BAD_ACCESS

彭正谊
2023-03-14

我工作的问题,以检查如果二进制结构树是平衡或不,当我运行代码,我得到EXC_BAD_ACCESS,我不确定如何修复问题,是什么导致它打破。

假设代码在某个时刻命中 NULL 并返回 (true,-1),并深入到左侧子树。然后返回并转到右侧子树。我们可以检查左和右的子树是否由不同的平衡,如果它是

谢谢

#include <iostream>
using namespace std;

struct TreeNode {
    TreeNode * left;
    TreeNode * right;
};


class balanceStatusAndHeight{
public:
    bool isBalanced;
    int height;
    balanceStatusAndHeight(bool isBalanced, int height);
};


balanceStatusAndHeight::balanceStatusAndHeight(bool isBalanced, int height) {
    this->isBalanced = isBalanced;    
    this->height = height;
}




balanceStatusAndHeight checkBalance(TreeNode * root) {    

    if (root == NULL ) {
        return balanceStatusAndHeight(true, -1);
    }

    balanceStatusAndHeight leftResult = checkBalance(root->left);
    if ( !leftResult.isBalanced  ) {
        return leftResult;
    }

    balanceStatusAndHeight rightResult = checkBalance(root->right);
    if ( !rightResult.isBalanced) {
        return rightResult;
    }


    bool subTreesAreBalanced = abs(leftResult.height - rightResult.height) <= 1;
    int height = max(leftResult.height, rightResult.height) + 1;

    return balanceStatusAndHeight(subTreesAreBalanced, height);

};




int main(int argc, const char * argv[]) {

    TreeNode *a = new TreeNode;
    a->left = new TreeNode;
    a->left->left = new TreeNode;

    balanceStatusAndHeight c = checkBalance(a);


    cout << c.isBalanced << endl;



    return 0;
}

共有1个答案

暨曾笑
2023-03-14

在< code >检查余额中

if (root == NULL ) 

要求树分支以< code>NULL终止。不幸的是,代码中没有任何东西可以确保树是以< code>NULL终止的,所以当测试遇到未初始化的< code>left或< code>right指针,然后程序试图访问未初始化指针处的无效< code>TreeNode时,测试就会失败。

有了现代编译器

struct TreeNode {
    TreeNode * left = NULL; // but prefer nullptr to NULL as it has better type safety
    TreeNode * right = NULL;
};

解决了这个问题。由于正在使用NULL而不是nullptr,编译器可能很旧或故意设置为较旧的C标准修订版,因此需要一个构造函数。

struct TreeNode {
    TreeNode * left;
    TreeNode * right;

    TreeNode():left(NULL), right(NULL)
    {

    }
};

一个更聪明的构造器或者对聚合初始化的巧妙使用可以让你的生活更轻松。

此更改后程序是否正常工作?不知道。没有测试。但是,它不会崩溃。

 类似资料:
  • 我有一个<code>BinarySearchTree</code>,里面有Instance bankaccount的对象,这是我创建的一个类,所以基本上它只是一个二进制搜索树,我编写了一个方法,它将获取树并对其进行平衡,因为某些原因,它在平衡之前准确地打印出树: 现在,首先我有方法,它接受一个列表和一个并通过按顺序检查树数据来创建树数据的,因此它是一个排序数组。然后使用另一种方法以平衡的方式创建树

  • 你们好,伙计们,我正在试图理解我如何看到二叉树是否平衡。我试图打印出cout语句,以便进一步理解它,但运气不好。 算法的想法是,如果它返回-1,它就不平衡,如果它返回其他任何东西,它是平衡的。 然而,我并没有真正理解这个算法是如何工作的。但是我想知道的一些事情是; 我的困惑点在于以下代码行: 如果 (根 == 空) 返回 0; 当它返回 0 时会发生什么,何时达到 0?它只是为了防止递归继续转到未

  • 主要内容:二叉排序树转化为平衡二叉树,构建平衡二叉树的代码实现,总结上一节介绍如何使用二叉排序树实现动态 查找表,本节介绍另外一种实现方式—— 平衡二叉树。 平衡二叉树,又称为  AVL 树。实际上就是遵循以下两个特点的二叉树: 每棵子树中的左子树和右子树的深度差不能超过 1; 二叉树中每棵子树都要求是平衡二叉树; 其实就是在二叉树的基础上,若树中每棵子树都满足其左子树和右子树的深度差都不超过 1,则这棵二叉树就是平衡二叉树。 图 1 平衡与不平衡的二叉树及结点的

  • 本文向大家介绍数据结构 二叉树的递归与非递归,包括了数据结构 二叉树的递归与非递归的使用技巧和注意事项,需要的朋友参考一下 数据结构 二叉树的递归与非递归 实例代码:  先序遍历(递归法)   后序遍历      感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

  • NowCoder 题目描述 平衡二叉树左右子树高度差不超过 1。 解题思路 // java private boolean isBalanced = true; public boolean IsBalanced_Solution(TreeNode root) { height(root); return isBalanced; } private int height(Tre

  • 排序二叉树中存在一个问题就是可能会退化成一个链表,当只有左子树或者右子树有节点的时候,此时排序二叉树就像链表一样,但因为排序二叉树在插入查询的时候还要判断左右子树的问题,这样查询的效率反而变低,从而引出了平衡二叉树 平衡二叉树又称平衡搜索树(Self-balance Binary Search Tree)又称AVL树,同时保证了查询和添加的效率。首先平衡二叉树是一颗排序二叉树,且它是空树或者他的每