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

递归法计算二叉树高度:请判断该实现是否正确并给出见解

分析你的二叉树高度递归实现

嘿,我来帮你拆解这段代码的问题,以及如何修正它~

首先,这段代码无法正确运行,甚至编译都会失败,主要有两个核心问题:

1. Math.max的参数使用错误

你写的Math.max(BTHeight(root.left) + BTHeight(root.right))是完全错误的:

  • Math.max需要接收两个独立的数值参数(或者一个数值数组),用来比较取最大值。
  • 你现在把左右子树的高度相加后传给Math.max,不仅逻辑上完全偏离了“取左右子树高度最大值”的需求,而且语法上也不合法——Java里没有Math.max(int)的重载方法,编译时会直接报错。

正确的写法应该是传入两个子树的高度:Math.max(BTHeight(root.left), BTHeight(root.right))

2. 多余的else if判断逻辑

你添加的root.left != null || root.right != null分支完全是冗余的:

  • 当节点是叶子节点(左右子树都为null)时,递归调用BTHeight(root.left)和BTHeight(root.right)都会返回-1,此时1 + Math.max(-1, -1)的结果就是0,和你最后return 0的逻辑完全一致。
  • 保留这个分支反而会让代码逻辑变得复杂,甚至可能在某些边界场景下出现判断遗漏(比如节点只有一个子节点的情况,虽然这里不会出错,但没必要)。

修正后的代码

如果你的需求是计算二叉树的边高度(空树为-1,叶子节点为0,根到叶子的边数为高度),修正后的代码可以简化成这样:

public class Node { 
    int value; 
    Node left = null; 
    Node right = null; 
    public Node(int value) { 
        this.value = value; 
    } 
} 

class Main { 
    public int BTHeight(Node root) { 
        // 空树的边高度为-1
        if(root == null) { 
            return -1; 
        } 
        // 递归计算左右子树高度,取最大值加1(当前节点到子树的一条边)
        int leftHeight = BTHeight(root.left);
        int rightHeight = BTHeight(root.right);
        return 1 + Math.max(leftHeight, rightHeight); 
    } 
}

验证几个典型场景

我们来测试几个常见情况,确认逻辑正确:

  • 空树:传入null,返回-1,符合边高度定义。
  • 仅根节点:左右子树都是null,返回1 + Math.max(-1, -1) = 0,正确。
  • 根节点+左子节点:左子树返回0,右子树返回-1,最终返回1 + 0 = 1,正确(根到左子节点有1条边)。
  • 三层完全二叉树:根节点的左右子树高度都是1,最终返回1 + 1 = 2,正确(根到叶子有2条边)。

如果你的需求是计算节点高度(空树为0,叶子节点为1,根节点高度为树的层数),只需要把空树的返回值改成0,然后最终返回1 + Math.max(...)即可,逻辑类似。

内容的提问来源于stack exchange,提问作者codingpanda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:37:58