题目地址:
https://www.lintcode.com/problem/minimum-depth-of-binary-tree/description
给定一棵二叉树,求其最小深度。最小深度的定义是所有从树根到叶子节点路径中,长度最短的路径的节点个数。
可以用递归解决。如果树空,则返回 0 0 0;接着需要判断一下左右子树是否非空,因为若某个子树为空的话,到达null的路径是不能算成一条合法路径的。判断非空后递归求解即可。代码如下:
public class Solution {
/**
* @param root: The root of binary tree
* @return: An integer
*/
public int minDepth(TreeNode root) {
// write your code here
if (root == null) {
return 0;
}
if (root.left == null) {
return 1 + minDepth(root.right);
} else if (root.right == null) {
return 1 + minDepth(root.left);
} else {
return 1 + Math.min(minDepth(root.left), minDepth(root.right));
}
}
}
class TreeNode {
int val;
TreeNode left, right;
TreeNode(int x) {
val = x;
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( h ) O(h) O(h)。
算法正确性证明:
数学归纳法。如果树为空或左右子树都为空时,算法正确。假设算法对树有少于等于
k
k
k个节点时也正确,如果树有
k
+
1
k+1
k+1个节点,那么如果左子树为空,由数学归纳法,算法可以正确返回右子树的最短深度(因为右子树非空),再加上
1
1
1,结论正确;右子树为空时类似;若左右子树都非空,由数学归纳法也可以知道其能正确返回左右子树的最短深度,结论也正确。