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)取决于队列存储的元素数量
源自力扣官方题解