【一天一道算法题】- 【二叉树的最大深度】



计算复杂度

计算复杂度(Computational Complexity)是计算机科学中的一个核心概念,它用于描述解决特定问题所需的计算资源量,通常是指时间和空间资源的量度。计算复杂度理论试图理解和分类计算任务的难度,并确定哪些问题是容易解决的,哪些问题是难以解决的。

计算复杂度包括时间复杂度和空间复杂度:

  1. 时间复杂度:衡量算法执行所需时间的多少。它通常用大O符号(O-notation)来表示,例如O(n)、O(n^2)、O(log n)等,其中n代表输入数据的大小。

  2. 空间复杂度:衡量算法执行过程中需要的存储空间的多少。同样,它也使用大O符号来表示。

不同的场景,其计算复杂度的类别不同,复杂度类别可分为:

  • 常数复杂度(O(1)):无论输入数据量多大,算法所需的时间和空间都保持不变。

  • 对数复杂度(O(log n)):算法的资源需求随输入数据量的增长而按对数增长。

  • 线性复杂度(O(n)):算法的资源需求与输入数据量成正比。

  • 线性对数复杂度(O(n log n)):算法的资源需求与输入数据量的线性对数成正比,常见于某些高效的排序算法。

  • 二次复杂度(O(n^2)):算法的资源需求与输入数据量的平方成正比,常见于简单的双层循环算法。

  • 指数复杂度(O(2^n)):算法的资源需求随输入数据量呈指数级增长,这类算法通常不实用,因为它们随输入规模的增长而迅速变得非常耗时。

  • 阶乘复杂度(O(n!)):算法的资源需求随输入数据量呈阶乘级增长,常见于解决旅行商问题等组合优化问题。

二叉树的最大深度

如果我们知道了左子树和右子树的最大深度 lll 和 rrr,那么该二叉树的最大深度即为 max ⁡ ( l , r ) + 1 \max(l,r)+1 max(l,r)+1而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用「深度优先搜索」的方法来计算二叉树的最大深度。具体而言,在计算当前二叉树的最大深度时,可以先递归计算出其左子树和右子树的最大深度,然后在 O(1) 时间内计算出当前二叉树的最大深度。递归在访问到空节点时退出

# Definition for a binary tree node
# class TreeNode:
# 	def __init__(self, val=0, right=None, left=None):
# 		self.val = val
#		self.right = right
#		self.left = left
class Solution:
	def maxDepth(self, root:Optional[TreeNode]) -> 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 
  • 这种嵌套结构,就好比scrapy 里面对所有网站的爬取,从根网址开始,对所有网址记录的网址进行跳转。不同的是,这里是二叉树,所以一个节点最多只有两个分支。
  • root: Optional[TreeNode] 表示root参数是一个可选的TreeNode类型。这意味着root可以是一个TreeNode对象,也可以是None。

https://leetcode.cn/problems/maximum-depth-of-binary-tree/solutions/349250/er-cha-shu-de-zui-da-shen-du-by-leetcode-solution/

  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值