【LeetCode】104. 二叉树的最大深度【简单】

1. 题目描述

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

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回它的最大深度 3 。

2. 解题思路 & 代码

2.1 递归:DFS(深度优先搜索)

# 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_height = self.maxDepth(root.left)
        right_height = self.maxDepth(root.right)
        
        return max(left_height, right_height) + 1

复杂度分析

  1. 时间复杂度:我们每个结点只访问一次,因此时间复杂度为 O ( N ) O(N) O(N)
    其中 N N N 是结点的数量。
  2. 空间复杂度:在最糟糕的情况下,树是完全不平衡的,例如每个结点只剩下左子结点,递归将会被调用 N N N 次(树的高度),因此保持调用栈的存储将是 O ( N ) O(N) O(N)。但在最好的情况下(树是完全平衡的),树的高度将是 l o g ( N ) log(N) log(N)。因此,在这种情况下的空间复杂度将是 O ( l o g ( N ) ) O(log(N)) O(log(N))

2.2 迭代:DFS 深度优先

使用,将上述递归问题转化为迭代
使用栈,用 pop,即队尾出列

# 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
        stack = []
        stack.append([1, root])  # 从包含根结点且相应深度为 1 的栈开始
        depth = 0
        while stack:  # 栈不空
            current_depth, root = stack.pop()
            if root:
                depth = max(depth, current_depth)
                stack.append([current_depth + 1, root.left])
                stack.append([current_depth + 1, root.right])
        return depth

复杂度分析

  1. 时间复杂度: O ( N ) O(N) O(N)
  2. 空间复杂度: O ( N ) O(N) O(N)

2.3 BFS

使用队列,用 pop(0),即队头出列

# 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
        queue = []
        queue.append(root)
        depth = 0
        while queue:
            depth += 1
            for i in range(len(queue)):
                temp = queue.pop(0)
                if temp.left:
                    queue.append(temp.left)
                if temp.right:
                    queue.append(temp.right)
        return depth

参考:

  1. LeetCode官方题解.
全部评论

相关推荐

12-15 18:00
巨人网络_招聘
投递巨人网络等公司6个岗位
点赞 评论 收藏
分享
11-23 15:33
已编辑
门头沟学院 Java
CUTMR:换账号试试重启推荐算法,我换账号之后回复率还不错,约莫有个20%左右的消息回复率,前几页、主动招呼的HR也开始符合我期望薪资,此前的大号从招呼、回复、前几页的岗位薪资在涨幅30%+以上 用着用着聊着聊着就变成-20%,而且我开通会员之后直接0面试
点赞 评论 收藏
分享
程序员花海:实习和校招简历正确格式应该是教育背景+实习+项目经历+个人评价 其中项目经历注意要体现业务 实习经历里面的业务更是要自圆其说 简历模板尽可能保持干净整洁 不要太花哨的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务