我实现的二叉树高度计算代码无法通过测试,是哪里出了问题?
代码缺陷分析
你的代码存在三个核心错误:
- 全局变量
result1、result2被所有递归调用共享,深层递归对这两个变量的修改会覆盖上层递归存储的临时计算值,导致高度计算逻辑完全错乱。 - 未处理节点只有单侧子树的场景:当节点不存在左/右子树时,对应的
result1/result2不会被重新赋值,会保留之前递归过程中遗留的脏值,最终返回错误的比较结果。 - 未处理根节点为空的边界输入,会触发空指针访问崩溃。
典型出错场景示例
举一个最简单的出错树结构:
1 / 2 / 3
该树按边数统计高度应为2,你的代码执行逻辑如下:
- 调用
MyHeight(3):左右子树为空,返回0 - 回到
MyHeight(2)逻辑:左子树存在,result1 = 0+1=1;右子树不存在,result2保留之前的全局值(假设为上一轮递归留下的0),比较后返回1 - 回到
MyHeight(1)逻辑:左子树存在,result1 =1+1=2;右子树不存在,此时如果result2被之前其他递归分支修改为大于2的值,就会直接返回错误的result2,而非正确的2。
如果是更复杂的树(比如你提到的测试用例对应的多分支树),全局变量的脏值会导致计算结果完全不符合预期。
修复后的参考实现
将变量改为函数内部局部变量,补全边界处理即可:
int MyHeight(Node *root) { // 空节点返回-1,适配边数统计;如果要适配节点数统计,此处返回0 if(root == NULL) return -1; if(root->left == NULL && root->right == NULL) { return 0; } // 变量改为局部,每次调用重新初始化 int result1 = -1, result2 = -1; if(root->left) { result1 = MyHeight(root->left) + 1; } if(root->right) { result2 = MyHeight(root->right) + 1; } return result1 > result2 ? result1 : result2; } int get_Height(Node* root) { // 适配平台节点数统计的话,直接在返回值加1即可 return MyHeight(root); }
如果要适配平台按节点数统计高度的规则,只需要将最终返回值加1,或者修改空节点返回0、叶子节点返回1即可。
内容的提问来源于stack exchange,提问作者ankur katiyar
相关产品推荐
相关产品推荐

