LeetCode515-在每个树行中找最大值

题目链接

英文链接:https://leetcode.com/problems/find-largest-value-in-each-tree-row/

中文链接:https://leetcode-cn.com/problems/find-largest-value-in-each-tree-row/

题目详述

您需要在二叉树的每一行中找到最大的值。

示例:

1
2
3
4
5
6
7
8
9
输入: 

1
/ \
3 2
/ \ \
5 3 9

输出: [1, 3, 9]

题目详解

方法一:运用 BFS。

进行层次遍历,找到每行中的最大值,将这个最大值加入到结果集中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class LeetCode_00515 {

public List<Integer> largestValues(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
List<Integer> res = new ArrayList<>();
Queue<TreeNode> queue = new ArrayDeque<>();
queue.offer(root);
while (!queue.isEmpty()) {
int size = queue.size();
int max = Integer.MIN_VALUE;
while (size-- != 0) {
TreeNode node = queue.poll();
max = Math.max(max, node.val);
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
res.add(max);
}
return res;
}
}

方法二:运用 DFS。

  • 当第一次进入这一行时,直接把当前值加入到结果中。
  • 再一次进入这行时,直接在结果链表中更新这一行的最大值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class LeetCode_00515 {

public List<Integer> largestValues(TreeNode root) {
List<Integer> res = new ArrayList<>();
dfs(root, 0, res);
return res;
}

private void dfs(TreeNode root, int level, List<Integer> list) {
if (root == null) {
return;
}
if (list.size() == level) {
list.add(root.val);
} else {
if (root.val > list.get(level)) {
list.set(level, root.val);
}
}
dfs(root.left, level + 1, list);
dfs(root.right, level + 1, list);
}
}