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), 存储二叉树节点的空间开销。