[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 }

 

LeetCode 题目总结

posted @ 2020-03-18 10:29  CNoodle  阅读(445)  评论(0编辑  收藏  举报