• LeetCode 104. 二叉树的最大深度 | Python


    104. 二叉树的最大深度


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

    题目


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

    二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

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

    示例:

    给定二叉树 [3,9,20,null,null,15,7],
    
        3
       / 
      9  20
        /  
       15   7
    返回它的最大深度 3 。
    

    解题思路


    思路:递归、广度优先搜索

    题目中提示,【二叉树的深度为根节点到最远叶子节点的最长路径上的节点数】。那么在这里,我们考虑从递归和广度优先搜索的思路去解决此问题。下面先从递归的思路,对问题进行分析解决。

    递归

    根据题目的提示,我们知道,二叉树的深度是跟它的左右子树的深度有关。

    前面说,二叉树的深度是根节点到最远叶子节点的最长路径上的节点数,那么也就说当我们得到左子树和右子树的最大深度时,只要取两者中较大深度的加上根节点的深度就是整个二叉树的深度。那么也就是说:二叉树的最大深度 = 左右子树最大深度较大的深度 + 根节点的高度。如下面的式子:

    max_depth = max(left_tree_depth, right_tree_depth) + 1

    那么现在的问题就是如何去求左右子树的最大深度,在这里,两者的计算方式是相同的。我们可以递归去计算左右子树的最大深度,当遇到叶子节点时,退出递归。

    具体的代码见【代码实现 # 递归】

    广度优先搜索

    这里,我们也可以使用广度优先搜索的思路来解决问题。在这里,我们需要添加一个辅助队列。我们将当前层的所有节点都存入这个辅助队列中。

    在这里需要注意一点,当我们准备搜索下一层时,这里需要将队列中当前层的所有节点都进行出队,然后让这些节点往下层搜索。

    那么,如果当前层的所有节点都出列,队列还非空,那么说明下一层还有节点。循环直至队列为空,定义变量 depth,每层搜索的时候维护更新该值,那么最终,depth 就是我们要求的二叉树最大深度。

    具体的代码见【代码实现 # 广度优先搜索】

    代码实现


    # 递归
    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution:
        def maxDepth(self, root: TreeNode) -> int:
            # 终止条件
            if not root:
                return 0
    
            # 递归计算左右子树的最大深度
            left_tree_depth = self.maxDepth(root.left)
            right_tree_depth = self.maxDepth(root.right)
    
            return max(left_tree_depth, right_tree_depth) + 1
    
    # 广度优先搜索
    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution:
        def maxDepth(self, root: TreeNode) -> int:
            # 处理特殊情况
            if not root:
                return 0
    
            from collections import deque
            # 辅助队列
            queue = deque()
    
            # 记录二叉树深度,维护更新,
            depth = 0
    
            queue.append(root)
    
            while queue:
                # 当前层所有节点出列,往下搜索
                size = len(queue)
    
                for i in range(size):
                    node = queue.popleft()
                    if node.left:
                        queue.append(node.left)
                    if node.right:
                        queue.append(node.right)
    
                depth += 1
            
            return depth
    
    

    实现结果


    实现结果 # 递归

    实现结果 | 递归

    实现结果 # 广度优先搜索

    实现结果 | 广度优先搜索

    欢迎关注


    公众号 【书所集录

  • 相关阅读:
    0502-计算图
    0601-利用pytorch的nn工具箱实现LeNet网络
    0501-Variable
    0201-PyTorch0.4.0迁移指南以及代码兼容
    0401-Tensor的基础操作
    0303-利用手写数字问题引入深度神经网络
    0302-利用pytorch解决线性回归问题
    ZT台式机 Tensorflow配置
    java计算日期之间的时间差并转为毫秒
    sklearn cluster KMeans
  • 原文地址:https://www.cnblogs.com/yiluolion/p/13393059.html
Copyright © 2020-2023  润新知