题目
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
解题思路
之前有一道二叉树的最大深度的题目比较类似,那道题是使用递归取左右子树的深度取最大值。
递归解法
那这道题就是相反:取左右子树深度的最小值,通过递归的过程。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public int minDepth(TreeNode root) {
if(root == null){
return 0;
}
int left = minDepth(root.left) + 1;
int right = minDepth(root.right) + 1;
return Math.min(left,right);
}
什么?
这样不对,[2,1]不能通过。应该输出2,但是上面的代码输出了1。
再阅读题目,原来它的要求是到叶子节点的深度,如果只有跟节点是不算作深度的,我们需要怎么改的,大家可以想一想
思考时间
我们可以判断如果没有左右子树,就以其他的子树的深度为准。
public int minDepth(TreeNode root) {
if (root == null) {
return 0;
}
//以右子树的高度为准
if (root.left == null && root.right != null) {
return 1 + minDepth(root.right);
}
//以左子树的高度为准
if (root.right == null && root.left != null) {
return 1 + minDepth(root.left);
}
return 1 + Math.min(minDepth(root.left), minDepth(root.right));
}
迭代解法
这道题也可以使用迭代求解,利用层序遍历记录层数,到达叶子节点的时候,判断得到一个最小的节点即可,自己写下代码把。
网友评论