一、题目概述
二、思路方向
在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。但是,为了清晰起见,我在示例代码中保留了这两个检查。在实际应用中,你可以通过稍微修改代码来优化这一点。
结语
不受苦中苦
难为人上人
!!!