C++ 二叉树结构平衡,使用递归时EXC_坏_访问

C++ 二叉树结构平衡,使用递归时EXC_坏_访问,c++,algorithm,binary-tree,C++,Algorithm,Binary Tree,我正在研究这个问题,以检查二叉结构树是否平衡,当我运行代码时,我得到了EXC_BAD_访问权限,我不确定如何修复这个问题以及是什么导致它崩溃 假设代码在某个点命中NULL并返回(true,-1),然后深入到左子树。然后返回并转到右子树。如果是height=height,我们可以检查左、右子树是否平衡不同; } 平衡状态和高度校验平衡(TreeNode*根){ if(root==NULL){ 返回平衡状态和高度(true,-1); } balanceStatusAndHeight leftResu

我正在研究这个问题,以检查二叉结构树是否平衡,当我运行代码时,我得到了EXC_BAD_访问权限,我不确定如何修复这个问题以及是什么导致它崩溃

假设代码在某个点命中NULL并返回(true,-1),然后深入到左子树。然后返回并转到右子树。如果是height=height,我们可以检查左、右子树是否平衡不同; } 平衡状态和高度校验平衡(TreeNode*根){ if(root==NULL){ 返回平衡状态和高度(true,-1); } balanceStatusAndHeight leftResult=检查平衡(根->左); 如果(!leftResult.isBalanced){ 返回结果; } balanceStatusAndHeight rightResult=检查平衡(根->右); 如果(!rightResult.isBalanced){ 返回正确的结果; } 布尔子树平衡=abs(leftResult.height-rightResult.height)左=新树节点; a->left->left=新树节点; 平衡状态和高度c=校验平衡(a);
checkBalance

if (root == NULL ) 
期望树分支被
NULL
终止。不幸的是,代码中没有任何内容可以确保树被
NULL
终止,因此当它命中未初始化的
left
right
指针,然后程序尝试访问未初始化指针处的无效
TreeNode
时,此测试失败。

使用现代编译器

结构树节点{ TreeNode*left=NULL;//但更喜欢nullptr而不是NULL,因为它具有更好的类型安全性 TreeNode*右=空; };

解决了这个问题。因为Nult正在取代原来的代码> NulLPTR < /代码>,编译器可能是旧的或故意设置为一个旧的C++标准修订版,而需要一个构造函数。 结构树节点{ TreeNode*左; TreeNode*对; TreeNode():左(空)、右(空) { } }; 一个更聪明的构造器或巧妙地使用可以让你的生活更轻松


这个程序在这次更改后工作吗?不知道。没有进行测试。但是它没有崩溃。我看到一些测试是针对
NULL
,但是绝对没有将变量设置为
NULL
。除非您自己做,否则不要假设动态分配的对象初始化得很好。将构造函数添加到
TreeNode
,以
NULL
。通常我会建议如下:绝对确保递归在堆栈用完之前停止。因为这里有一个非常小的树,所以不应该发生这种情况,所以我的建议是您使用开发环境的调试器逐步完成程序,看看它在哪里NGS在轨道上偏离了轨道。但是在这种情况下,我认为你已经被评论1绊倒了:树不知道该停在哪里,并漫游到无效的内存中。@ USER45 81301关心地回答:D,我只想补充一下,如果你真的必须使用C++来做你应该做的事情,你应该熟悉ValrnnD,啊,是的,谢谢。为什么?ESC++不是为我做的,只是把NULL或初始化好了吗?@ USER481301C++是基于这样一个原则的:你不为你不使用的任何东西付费。变量的自动零化是一个成本,如果你要在使用它之前将变量设置成一个好的值,你不需要支付。最终的结果是更少的工作和更快的P。罗格瑞姆。缺点是粗心或无知更容易让你自暴自弃。但布加迪也可以这么说。速度太快了。用它自杀也太容易了。
if (root == NULL )