递归法计算二叉树高度:请判断该实现是否正确并给出见解
分析你的二叉树高度递归实现
嘿,我来帮你拆解这段代码的问题,以及如何修正它~
首先,这段代码无法正确运行,甚至编译都会失败,主要有两个核心问题:
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
相关产品推荐
相关产品推荐

