You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

我实现的二叉树高度计算代码无法通过测试,是哪里出了问题?

代码缺陷分析

你的代码存在三个核心错误:

  • 全局变量result1、result2被所有递归调用共享,深层递归对这两个变量的修改会覆盖上层递归存储的临时计算值,导致高度计算逻辑完全错乱。
  • 未处理节点只有单侧子树的场景:当节点不存在左/右子树时,对应的result1/result2不会被重新赋值,会保留之前递归过程中遗留的脏值,最终返回错误的比较结果。
  • 未处理根节点为空的边界输入,会触发空指针访问崩溃。
典型出错场景示例

举一个最简单的出错树结构:

1
   /
  2
 /
3

该树按边数统计高度应为2,你的代码执行逻辑如下:

  1. 调用MyHeight(3):左右子树为空,返回0
  2. 回到MyHeight(2)逻辑:左子树存在,result1 = 0+1=1;右子树不存在,result2保留之前的全局值(假设为上一轮递归留下的0),比较后返回1
  3. 回到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:24:00