给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:2
示例 2:
输入:root = [2,null,3,null,4,null,5,null,6]
输出:5
做递归的题目也有一阵子了,却感觉自己总在门外徘徊,在此引用leetcode上别人关于递归的一个总结(来自main):
- 1.写出结束条件
- 2.不要把树复杂化,就当做树是三个节点,根节点,左子节点,右子节点
- 3.只考虑当前做什么,不用考虑下次应该做什么
- 4.每次调用应该返回什么
尤其注意3、4两点
对应到此题中,考虑当前做什么:
我需要对每一种情况分别判断
对于每一个节点,拿到这个节点后,这个节点有五种可能
为空
不为空,左右均为空
不为空,左右均不为空
不为空,左或者右有一个有值,一个为空
那么我又需要做什么呢(或者说我需要返回什么):
我需要知道这个节点的深度
对于上述五种情况1和情况2,返回值容易写
对于上述五种情况剩余三种,其返回值与子节点有关,但是我并不需要去想其子节点的深度到底是多少,只需要交由计算机,这个步骤将由其自动完成计算
以
if(root.left!=null && root.right!=null)
return Math.min(minDepth(root.left),minDepth(root.right))+1;
为例,
如果左子节点和右子节点均不为空,那我就知道当前节点的最小深度必然是左或者右里面的一个小值再加1,至于左或者右的深度是多少,怎么计算,我不知道,也不用管,因为现在只考虑当前节点,其余节点的计算和我没有关系
因此返回值为 return Math.min(左边深度,右边深度)+1
剩余的两种情况也是同理
代码:
-
public int minDepth(TreeNode root) { if(root==null) return 0; if(root.left==null && root.right==null) return 1; if(root.left!=null && root.right!=null) return Math.min(minDepth(root.left),minDepth(root.right))+1; if(root.left!=null) return minDepth(root.left)+1; if(root.right!=null) return minDepth(root.right)+1; return 1; }