[LeetCode] 111. Minimum Depth of Binary Tree
Given a binary tree, find its minimum depth.
The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node.
Note: A leaf is a node with no children.
Example 1:
Input: root = [3,9,20,null,null,15,7] Output: 2
Example 2:
Input: root = [2,null,3,null,4,null,5,null,6] Output: 5
Constraints:
- The number of nodes in the tree is in the range
[0, 105]
. -1000 <= Node.val <= 1000
二叉树的最小深度。
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-depth-of-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我这里提供两种思路,一种是后序遍历,一种是 BFS。
第一种思路是后序遍历。如果左孩子和右孩子有一个为 NULL 则最小深度为 left + right + 1;否则就正常看两边较小的深度 + 1。这个思路有点不太好想,注意有些树可能是只有一个子树,另一个子树完全缺失的情况。如果单纯考虑比较左右子树谁的深度更小,则会返回错误的结果。
时间O(n)
空间O(n) - worse case,如果树不平衡,比如 node 全是左子树或者右子树;平均空间是 O(log(n))
Java实现
1 class Solution { 2 public int minDepth(TreeNode root) { 3 if (root == null) { 4 return 0; 5 } 6 int left = minDepth(root.left); 7 int right = minDepth(root.right); 8 if (left == 0 || right == 0) { 9 return left + right + 1; 10 } 11 return Math.min(left, right) + 1; 12 } 13 }
JavaScript实现
1 /** 2 * @param {TreeNode} root 3 * @return {number} 4 */ 5 var minDepth = function (root) { 6 if (root == null) { 7 return 0; 8 } 9 let left = minDepth(root.left); 10 let right = minDepth(root.right); 11 if (left == 0 || right == 0) { 12 return left + right + 1; 13 } 14 return Math.min(left, right) + 1; 15 };
第二种思路是 BFS。按照 BFS 的经典模板去遍历每一层的 node。每弹出一个 node 的时候,判断当前 node 是否有左孩子和右孩子,如果没有,则说明当前这个 node 的深度应该是最小的了。这个思路可以规避根节点只有一边有子树的情形。
时间O(n)
空间O(n)
Java实现
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 class Solution { 11 public int minDepth(TreeNode root) { 12 // corner case 13 if (root == null) { 14 return 0; 15 } 16 17 // normal case 18 Queue<TreeNode> queue = new LinkedList<>(); 19 queue.offer(root); 20 int depth = 1; 21 while (!queue.isEmpty()) { 22 int size = queue.size(); 23 for (int i = 0; i < size; i++) { 24 TreeNode cur = queue.poll(); 25 if (cur.left == null && cur.right == null) { 26 return depth; 27 } 28 if (cur.left != null) { 29 queue.offer(cur.left); 30 } 31 if (cur.right != null) { 32 queue.offer(cur.right); 33 } 34 } 35 depth++; 36 } 37 return depth; 38 } 39 }