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
相关推荐
py有趣1 小时前
力扣热门100题之环形链表
算法·leetcode·链表
py有趣1 小时前
力扣热门100题之回文链表
算法·leetcode·链表
样例过了就是过了5 小时前
LeetCode热题100 柱状图中最大的矩形
数据结构·c++·算法·leetcode
wsoz5 小时前
Leetcode哈希-day1
算法·leetcode·哈希算法
阿Y加油吧5 小时前
LeetCode 二叉搜索树双神题通关!有序数组转平衡 BST + 验证 BST,小白递归一把梭
java·算法·leetcode
liuyao_xianhui6 小时前
优选算法_最小基因变化_bfs_C++
java·开发语言·数据结构·c++·算法·哈希算法·宽度优先
小肝一下7 小时前
每日两道力扣,day2
c++·算法·leetcode·职场和发展
漂流瓶jz7 小时前
UVA-11846 找座位 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·排序算法·深度优先·aoapc·算法竞赛入门经典·uva
开开心心就好7 小时前
免费好用:PPT演示计时提醒工具
windows·计算机视觉·计算机外设·逻辑回归·excel·深度优先·csdn开发云
米粒18 小时前
力扣算法刷题 Day 31 (贪心总结)
算法·leetcode·职场和发展