iven a binary tree, find its maximum/minimum depth.
The maximum/minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node.
两个很相似的题,但是解法完全不怎么一样。
求max比较简单,见如下:
public int maxDepth(TreeNode root) {
if (root == null) return 0;
return Math.max(maxDepth(root.left), maxDepth(root.right))+1;
}
非常精简的代码,彰显了树这种数据结构的特性。
求min就不一样了,因为是root到leaf的距离,所以就必须是叶子节点。如下代码很容易写出来,但是是错了。
public int minDepth(TreeNode root) {
if (root == null) return 0;
return Math.min(minDepth(root.left), minDepth(root.right))+1;
}
因为上述代码并没有保证到叶子节点,为什么求max就可以呢?自己想吧。
更改过之后的版本:
public int minDepth(TreeNode root) {
if (root == null) {
return 0;
}
int left = minDepth(root.left);
int right = minDepth(root.right);
return (left == 0 || right == 0) ? left + right + 1: Math.min(left,right) + 1;
}
但是其实发现,求min值是不需要遍历所有节点的,所以按照层次遍历会节省时间:
public int minDepth(TreeNode root) {
if (root == null) {
return 0;
}
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(root);
int depth = 0;
while (!queue.isEmpty()) {
depth++;
int len = queue.size();
for (int i = 0; i < len; i++) {
TreeNode node = queue.poll();
if (node.left == null && node.right == null) {
return depth;
}
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
}
return 0;
}