当前位置: 首页 > article >正文

python-leetcode 36.二叉树的最大深度

题目:

给定一个二叉树root,返回其最大深度

二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数


方法一:深度优先搜索

知道了左子树和右子树的最大深度l和r,那么该二叉树的最大深度即为:max(l,r)+1

而左子树和右子树的最大深度又可以以同样的方式进行计算。因此可以用「深度优先搜索」的方法来计算二叉树的最大深度。具体而言,在计算当前二叉树的最大深度时,可以先递归计算出其左子树和右子树的最大深度,然后在O(1)时间内计算出当前二叉树的最大深度。递归在访问到空节点时退出。

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def maxDepth(self, root):
        """
        :type root: Optional[TreeNode]
        :rtype: int
        """
        if root is None:
            return 0
        else:
            left_height=self.maxDepth(root.left)
            right_height=self.maxDepth(root.right)
        return max(left_height,right_height)+1

时间复杂度:O(n)n为二叉树节点的个数。每个节点在递归中只被遍历一次。

空间复杂度:O(height)其中height表示二叉树的高度


方法二:广度优先搜索

广度优先搜索的队列里存放的是「当前层的所有节点」。每次拓展下一层的时候,用一个变量ans来维护拓展的次数,该二叉树的最大深度即为ans。

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def maxDepth(self, root):
        """
        :type root: Optional[TreeNode]
        :rtype: int
        """
        if not root:
            return 0
        queue=[root] #使用一个队列(queue)来进行广度优先搜索, 初始时包含根节点 
        ans=0
        while queue: #在队列不为空时持续进行。每次循环表示遍历树的一层
            size=len(queue)  #获取当前队列中节点的数量,即当前层的节点数
            while size>0:
                node=queue.pop(0)
                if node.left:
                    queue.append(node.left) #当前节点 node 有左子节点,就将左子节点加入队列
                if node.right:
                    queue.append(node.right)#当前节点 node 有右子节点,就将右子节点加入队列
                size-=1  #处理完当前节点,减少层内节点计数
            ans+=1 #层处理完,增加深度计数器
        return ans

时间复杂度:O(n)每个节点只会被访问一次

空间复杂度:O(n)取决于队列存储的元素数量

源自力扣官方题解


http://www.kler.cn/a/556670.html

相关文章:

  • 如何结合使用thread-loader和cache-loader以获得最佳效果?
  • RPA-实例(UiPath )
  • 2024华为OD机试真题-关联子串(C++)-E卷B卷-100分
  • 在Docker中部署第一个应用
  • IntelliJ IDEA 插件推荐篇 - 2025年
  • Java EE初阶-计算机导论
  • 并查集算法篇上期:并查集原理及实现
  • 从Redis实现分布式锁的问题延伸到Redisson的使用入门
  • Mac book Air M2 用VMware安装 Ubuntu22.04
  • 大模型的参数微调笔记
  • [大模型笔记]扣子-知识库搭建,并用Java-SDK调用的笔记
  • 【自学笔记】Spring Boot框架技术基础知识点总览-持续更新
  • Eclipse 透视图 (Perspective)
  • python-leetcode-缺失的第一个正数
  • 网络安全-php安全知识点
  • 产品更新 | 数据集成ETLCloud V3.9 社区版发布,新增及优化组件近20项
  • Linux NFS
  • c++贪心系列
  • 侯捷 C++ 课程学习笔记:C++ 基础与演化
  • Vite vs Webpack