leetcode hot100 104. 二叉树的最大深度 easy 递归dfs 层序遍历bfs


一棵树的最大深度 = 111 (根节点自己) + 左右子树深度中的最大值。

递归解法(自底向上)

时间复杂度:O(n)O(n)O(n)。每个节点都要问一遍。

空间复杂度:O(height)O(height)O(height) 取决于树的高度

原函数maxDepth的定义是:

  • 输入:一个根节点。
  • 输出:一个代表深度的整数。

可以直接用原函数递归

什么时候需要定义辅助函数?

  • 最大深度:子问题返回的是答案(数字),父函数定义也是返回数字,正好。
  • 中序遍历:子问题要做的是动作(填表),父函数定义是返回list,但不需要每次都返回整个表,只是要部分值
python 复制代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:

        # 1. 递归出口:如果节点为空,深度就是 0
        if not root:
            return 0

        # 2. 递归获取左子树的最大深度
        left_height =  self.maxDepth(root.left)

        # 3. 递归获取右子树的最大深度
        right_height =  self.maxDepth(root.right)

        return max(left_height, right_height) + 1

自顶向下(层序遍历)

剥洋葱:剥掉一层,计数器加 111,直到剥完。

时间复杂度:O(n)O(n)O(n)。每个节点都要问一遍。

空间复杂度:O(width)O(width)O(width)。取决于树最宽的那一层节点数。

弹出最左元素:

  • 如用list列表:pop(0)
  • 如果用 collections.deque([root]) 双端队列:popleft()
python 复制代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:

        if not root:
            return 0


        # 每一层
        queue = [root]  # 初始层,顶层
        depth = 0

        # 把这层元素弹出,
        while queue:
            depth += 1
            for i in range(len(queue)):
                node = queue.pop(0)  # 每次弹出最左边 (队首)元素

                # 并加入弹出元素的左右子树
                if node.left: 
                    queue.append(node.left)
                if node.right: 
                    queue.append(node.right)

        return depth
相关推荐
Storynone24 分钟前
【Day24】LeetCode:122. 买卖股票的最佳时机 II,55. 跳跃游戏,45. 跳跃游戏II,1005. K次取反后最大化的数组和
python·算法·leetcode
滴滴答滴答答27 分钟前
机考刷题之 17&18&19&20&21&22 LeetCode 1248&121&43&93&62&63
算法·leetcode·职场和发展
Sakinol#31 分钟前
Leetcode Hot 100 ——回溯part02
算法·leetcode
历程里程碑33 分钟前
36 Linux线程池实战:日志与策略模式解析
开发语言·数据结构·数据库·c++·算法·leetcode·哈希算法
程序员夏末1 小时前
【LeetCode | 第五篇】算法笔记
笔记·学习·算法·leetcode
逆境不可逃9 小时前
LeetCode 热题 100 之 64. 最小路径和 5. 最长回文子串 1143. 最长公共子序列 72. 编辑距离
算法·leetcode·动态规划
Eward-an11 小时前
LeetCode 239. 滑动窗口最大值(详细技术解析)
python·算法·leetcode
一叶落43811 小时前
LeetCode 50. Pow(x, n)(快速幂详解 | C语言实现)
c语言·算法·leetcode
x_xbx12 小时前
LeetCode:26. 删除有序数组中的重复项
数据结构·算法·leetcode
j_xxx404_14 小时前
力扣困难算法精解:串联所有单词的子串与最小覆盖子串
java·开发语言·c++·算法·leetcode·哈希算法