二叉树最小/最大深度求解差异

最大深度算法

public int maxDepth(TreeNode root) {
    if (root == null) return 0;
    int left = maxDepth(root.left);
    int right = maxDepth(root.right);
    return Math.max(left, right) + 1;
}

最小深度算法

public int minDepth(TreeNode root) {
    if (root == null) return 0;
    
    int left = minDepth(root.left);
    int right = minDepth(root.right);
    
    // 关键区别在这里!
    if (root.left == null && root.right == null) {
        return 1;
    }
    if (root.left == null) {
        return right + 1;
    }
    if (root.right == null) {
        return left + 1;
    }
    
    return Math.min(left, right) + 1;
}

为什么逻辑不同?

核心区别:定义不同

  1. 最大深度:从根节点到最远叶子节点的最长路径上的节点数
  2. 最小深度:从根节点到最近叶子节点的最短路径上的节点数

关键场景:单子树情况

考虑这个树:

    1
   /
  2
 /
3
  • 最大深度:最长路径是 1 → 2 → 3,深度为 3
  • 最小深度:最近叶子节点是 3,深度为 3(因为没有其他叶子节点)

再看这个树:

    1
   / \
  2   3
     / \
    4   5
  • 最大深度:最长路径可能是 1 → 3 → 41 → 3 → 5,深度为 3
  • 最小深度:最近叶子节点是 2,深度为 2

问题场景:为什么不能简单用 Math.min()

如果对下面这个树用简单的 Math.min(left, right) + 1

    1
   /
  2
  • 左子树深度:1(节点2)
  • 右子树深度:0(null)
  • Math.min(1, 0) + 1 = 1 ❌ 错误!

实际上最小深度应该是 2(路径 1 → 2),因为节点2是叶子节点。

最小深度的正确逻辑

最小深度需要特别处理以下情况:

  1. 左右子树都为空:当前节点是叶子节点,深度为1
  2. 左子树为空:只能走右子树,深度 = 右子树最小深度 + 1
  3. 右子树为空:只能走左子树,深度 = 左子树最小深度 + 1
  4. 左右子树都不为空:取两边的最小值 + 1

总结

方面最大深度最小深度
定义到最远叶子到最近叶子
空子树处理直接用Math.max需要特殊判断
时间复杂度O(n)O(n)
空间复杂度O(h)O(h)

本质原因:对于最大深度,空子树(深度0)自然会被 Math.max() 排除;但对于最小深度,空子树(深度0)会被 Math.min() 选中,导致错误地认为空路径是有效路径,但实际上到达叶子节点才是有效的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值