zoukankan      html  css  js  c++  java
  • 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
    
    

    实现结果


    实现结果 # 递归

    实现结果 | 递归

    实现结果 # 广度优先搜索

    实现结果 | 广度优先搜索

    欢迎关注


    公众号 【书所集录

  • 相关阅读:
    TypeScript完全解读(26课时)_2.TypeScript完全解读-基础类型
    Flutter实战视频-移动电商-48.详细页_详情和评论的切换
    Flutter实战视频-移动电商-47.详细页_Flutter_html插件的使用
    TypeScript完全解读(26课时)_1.TypeScript完全解读-开发环境搭建
    [Android] The connection to adb is down, and a severe error has occured
    每日一小练——求质数
    C++语言笔记系列之十八——虚函数(1)
    Android 输入管理服务-输入事件向详细应用的分发
    Android技术归档
    C++编写绚丽的界面
  • 原文地址:https://www.cnblogs.com/yiluolion/p/13393059.html
Copyright © 2011-2022 走看看