一、题目概述
二、思路方向
在Java中,要找出二叉树的最小深度,我们可以使用递归的方法。基本思路是,对于给定的根节点,如果它是空的,那么最小深度为0(但实际上,空树没有深度,但在这个问题的语境下,我们可以认为空树的最小深度为0,或者更准确地,我们应该处理空树的情况以避免返回0)。如果根节点不是空的,我们需要检查它的左右子树:
- 如果根节点没有左子树(或右子树),那么最小深度就是右子树(或左子树)的最小深度加1。
- 如果根节点既有左子树又有右子树,那么最小深度就是左子树和右子树中较小的那个的最小深度加1。
三、代码实现
class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; }
} public class Solution { public int minDepth(TreeNode root) { // 如果树为空,则深度为0(但在实际逻辑中,我们不会直接返回0) if (root == null) { return 0; } // 如果树只有一个节点,即根节点,则深度为1 if (root.left == null && root.right == null) { return 1; } // 如果左子树为空,则递归计算右子树的最小深度 if (root.left == null) { return 1 + minDepth(root.right); } // 如果右子树为空,则递归计算左子树的最小深度 if (root.right == null) { return 1 + minDepth(root.left); } // 否则,取左右子树中较小的最小深度,并加1 return 1 + Math.min(minDepth(root.left), minDepth(root.right)); } public static void main(String[] args) { // 示例用法 TreeNode root = new TreeNode(3); root.left = new TreeNode(9); root.right = new TreeNode(20); root.right.left = new TreeNode(15); root.right.right = new TreeNode(7); Solution solution = new Solution(); int minDepth = solution.minDepth(root); System.out.println("Min Depth: " + minDepth); // 应该输出 2 }
}
执行结果:
四、小结
注意,在这个实现中,我添加了对空树和只有一个节点的树的特殊情况的处理。虽然对于空树的情况,通常我们会说它没有深度,但在这个问题中,我们假设空树的最小深度为0(尽管实际上在返回结果之前,我们不会遇到空树的情况,因为我们是在调用
minDepth(root)
时传入了一个非空的根节点)。对于只有一个节点的树,最小深度显然是1。此外,请注意,在检查左右子树是否为空时,我们实际上不需要同时检查两个条件,因为一旦确定了一个子树为空,我们就可以直接返回另一个子树的最小深度加1。但是,为了清晰起见,我在示例代码中保留了这两个检查。在实际应用中,你可以通过稍微修改代码来优化这一点。
结语
不受苦中苦
难为人上人
!!!