【力扣】111. 二叉树的最小深度 Python3解法

题目描述:

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

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

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

例子:

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

    3
   / \
  9  20
    /  \
   15   7

返回它的最小深度 2.

思路:

递归方法:
分为四种情况:
1.当前节点为空,返回0,表示不算当前这一层,不进行计数。
2.当前节点左节点为空,右节点不为空。当前节点赋值给右节点并➕1。
3.当前节点右节点为空,左节点不为空。当前节点赋值给左节点并➕1。
4.当前节点的左右节点都不为空,通过min函数找到最小值并➕1。
(如果左右节点都为空,则再次调用该函数时返回0不计算结果)

BFS:
扫荡每一层节点,返回第一次出现叶子节点的层数即可。

代码:

递归1:

class Solution:
    def minDepth(self, root: TreeNode) -> int:
        if root is None: return 0
        if root.left is None: return self.minDepth(root.right)+1
        if root.right is None: return self.minDepth(root.left)+1
        return min(self.minDepth(root.left),self.minDepth(root.right))+1

递归2:

class Solution:
    def minDepth(self, root: TreeNode) -> int:
        if root is None: return 0
        if root.left is None and root.right is None: return 1
        children = [root.left,root.right]
        res = float("inf")
        for c in children:
            if c:         #为了去除左节点或右节点有一个是None的情况
                res = min(self.minDepth(c),res)
        return res+1    #加1是加上了root那一层

BFS:

class Solution:
    def minDepth(self, root: TreeNode) -> int:
        if root is None:
            return 0
        depth = 1
        queue = [root]
        while queue:
            for i in range(len(queue)):
                p = queue.pop(0)#切记要先取出
                if p.left is None and p.right is None:
                    return depth
                if p.left:
                    queue.append(p.left)
                if p.right:
                    queue.append(p.right)
            depth += 1

DFS:

class Solution:
    def minDepth(self, root: TreeNode) -> int:
        if root is None:
            return 0
        self.ans = float('inf')
        self._dfs(root, 1)
        return self.ans
        
        
    def _dfs(self, node, level):
        if node is None:
            return          #当一条路径走到头时,判空
        if node.left is None and node.right is None:  #到叶子节点保存当前路径最小值
            self.ans = min(self.ans,level)
        self._dfs(node.left, level + 1)    #如果左叶子节点依然存在,不执行下一行代码,直到左叶子节点到头为止
        self._dfs(node.right, level + 1)   

知识点:

题目讲解

你可能感兴趣的:(python,二叉树)