LeetCode 111. 二叉树的最小深度 | Python

111. 二叉树的最小深度


题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/minimum-depth-of-binary-tree

题目


给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明: 叶子节点是指没有子节点的节点。

示例:

给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回它的最小深度 2.

解题思路


思路: DFS、BFS

审题,题目要求给定二叉树的最小深度。

最小深度: 指的是从根节点到叶子节点的最短路径上节点数量。

叶子节点: 指的是没有左右子节点的节点。

那么我们这里考虑从根节点出发,使用 DFS、BFS 的思路进行搜索。

DFS

先看使用 DFS(深度优先搜索)的方法,具体做法如下:

  • 根节点为空,返回 0;
  • 如果根节点不为空,需要判断左右子节点:
    • 左右子节点都为空,那么返回 1;
    • 左右子节点其中一个为空,那么返回不为空子节点的最小深度;
    • 左右子节点均不为空,返回其中较小深度的值。

具体的代码见【代码实现 # DFS】

BFS

这里,也可以使用 BFS(广度优先搜索)的方法,我们使用 BFS 方法时,是逐层去搜索的,那么我们只要发现某一层中,某个节点不存在子节点时,那么也就意味着从根节点到当前节点是最短路径。

具体的代码见【代码实现 # BFS】

代码实现


# DFS
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def minDepth(self, root: TreeNode) -> int:
        # 根节点为空
        if not root:
            return 0
        # 根节点不为空,分别讨论左右子节点
        depth = 1

        # 根节点不为空,但不存在左右子节点,返回 1
        if not root.left and not root.right:
            return 1
        # 不存在右子节点,返回不为空的左子节点最小深度
        elif not root.right:
            depth += self.minDepth(root.left)
        # 返回不为空的右子节点最小深度
        elif not root.left:
            depth += self.minDepth(root.right)
        # 左右子节点均不为空,返回较小深度
        else:
            left_depth = self.minDepth(root.left)
            right_depth = self.minDepth(root.right)
            depth += min(left_depth, right_depth)

        return depth

# BFS
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def minDepth(self, root: TreeNode) -> int:
        if not root:
            return 0

        from collections import deque
        queue = deque()
        queue.append(root)

        depth = 1

        while queue:
            # 逐层搜索,先记录每层节点数
            size = len(queue)
            for _ in range(size):
                node = queue.popleft()
                # 当前节点不存在子节点,那么当前节点在最小路径上
                if not node.left and not node.right:
                    return depth
                # 其中一个节点为空,返回不为空节点的最小深度
                elif not node.right:
                    queue.append(node.left)
                elif not node.left:
                    queue.append(node.right)
                # 左右子节点都不会空,返回其中较小深度
                else:
                    queue.append(node.left)
                    queue.append(node.right)
                
            depth += 1

实现结果


实现结果 | DFS

实现结果 | BFS

欢迎关注


公众号 【书所集录

posted @ 2020-08-21 18:15  "大梦三千秋  阅读(183)  评论(0编辑  收藏  举报