Leetcode 515. 在每个树行中找最大值

这篇博客介绍了如何在给定的二叉树中找到每一层的最大值,分别提供了深度优先搜索(DFS)和广度优先搜索(BFS)两种解决方案。在DFS中,通过前序遍历并维护当前高度的最大值;在BFS中,使用队列进行层序遍历,每次取出一层节点并更新最大值。两种方法的时间复杂度均为O(n),空间复杂度分别为O(height)和O(n)。
摘要由CSDN通过智能技术生成

1.题目描述

给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。
在这里插入图片描述

输入: root = [1,3,2,5,3,null,9]
输出: [1,3,9]


输入: root = [1,2,3]
输出: [1,3]


提示:

  • 二叉树的节点个数的范围是 [0,104]
  • -2^31 <= Node.val <= 2^31 - 1

2.思路分析

2.1 深度优先搜索

用树的「前序遍历」来进行 DFS 处理,并用 curHeight 来标记遍历到的当前节点的高度。当遍历到curHeight 高度的节点就判断是否更新该层节点的最大值。

2.2 广度优先搜索

使用 BFS 进行层序遍历,单次 BFS 逻辑将整一层的元素进行出队,维护当前层的最大值,并将最大值加入答案。

3.代码实现

3.1 深度优先搜索

# 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 largestValues(self, root: Optional[TreeNode]) -> List[int]:
        result = []

        def level(root: Optional[TreeNode], depth: int) -> None:
            if not root:
                return
            if depth == len(result):
                result.append(root.val)
            else:
                result[depth] = max(result[depth], root.val)

            level(root.left, depth + 1)
            level(root.right, depth + 1)
        level(root, 0)
        return result

复杂度分析

  • 时间复杂度:O(n),其中 n 为二叉树节点个数。二叉树的遍历中每个节点会被访问一次且只会被访问一次。
  • 空间复杂度:O(height)。其中 height 表示二叉树的高度。递归函数需要栈空间,而栈空间取决于递归的深度,因此空间复杂度等价于二叉树的高度。

3.2 广度优先搜索

# 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 largestValues(self, root: Optional[TreeNode]) -> List[int]:
        result = []
        if not root:
            return result

        from collections import deque
        que = deque([root])

        while que:
            max_val = que[0].val
            size = len(que)

            for _ in range(size):
                cur = que.popleft()
                # 每次维护一个最大值
                max_val = max(max_val, cur.val)

                if cur.left:
                    que.append(cur.left)
                if cur.right:
                    que.append(cur.right)
            result.append(max_val)
        return result

复杂度分析

  • 时间复杂度:O(n), 其中 n 为二叉树节点个数,每一个节点仅会进出队列一次。
  • 空间复杂度:O(n), 存储二叉树节点的空间开销。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值