题目:
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7]
,
3 / 9 20 / 15 7
返回它的最小深度 2.
分析:
我最初的思路是递归所有节点,节点不为null则加1,然后return当前节点左子树和右子树中长度较小的那个,如果节点为null,则return上一个节点递归时计算出的深度,但是这种想法存在着严重的缺陷。
当某个节点只有一个子节点时,会导致程序返回当前节点的深度。但实际上当前节点并不是叶子节点,这就很气了!为了修正这个bug,我采用如下的方案:
代码:
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public int minDepth(TreeNode root) { if (root == null) { return 0; } return minDeep(root, 0); } public int minDeep(TreeNode root, int sum) { if (root != null) { sum++; } if (root == null) { return Integer.MAX_VALUE; } if (root.left == null && root.right == null) { return sum; } return Math.min(minDeep(root.left, sum), minDeep(root.right, sum)); } }
也就是当某个节点只有一个子节点时,为null的一侧会返回一个其他数值绝对无法超越的值(因为最终返回值为int),导致自己的深度被其他深度淘汰掉。
但是,这样写总觉得不太好,有一种很牵强的感觉,后来看了其他人的答案... ...日常觉得自己菜ing... ...