持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情
题目详情
LeetCode题库序号 515. 在每个树行中找最大值 ,难度为 中等。
Tag : 「深度优先搜索」
给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。
示例 1:
输入: root = [1,3,2,5,3,null,9]
输出: [1,3,9]
示例 2:
输入: root = [1,2,3]
输出: [1,3]
提示:
- 二叉树的节点个数的范围是
[0,104] -231 <= Node.val <= 231 - 1
滑动窗口
题解思路:
这道题目是一道关于树搜索的题目,对此我们可以使用常见的两种搜索方式,我个人会偏向使用深度优先搜索(DFS)的方式进行求解。首先,我们通过题目意思,可以得知它需要求出每一层的最大值,关于最大值的求解的话,我们肯定需要遍历到树的每个节点上,才可以得知。所以在进行深度优先搜索的时候。我们需要记录每一层的当前最大值,然后拿之后遍历到的该层元素与当前最大值进行比较。最后会得出该层的最大值。依次类推,就会得出每一层的最大值了,返回即可。具体逻辑可以查看代码。
题解代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> largestValues(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
List<Integer> ans = new ArrayList<>();
dfs(ans, root, 0);
return ans;
}
public void dfs(List<Integer> ans, TreeNode node, int height) {
if (ans.size() == height) {
ans.add(node.val);
} else {
ans.set(height, Math.max(node.val, ans.get(height)));
}
if (node.left != null) {
dfs(ans, node.left, height + 1);
}
if (node.right != null) {
dfs(ans, node.right, height + 1);
}
}
}
结尾
我的"刷完LeetCode题库"系列文章的第 No.515 序号的题目,本次刷题之旅系列开始于 2022-06-12,因为LeetCode上部分是有锁题,我自己的目标是将先把所有不带锁的题目刷完。自己能够通过这次刷题之旅勉励自己,并且提升逻辑思维能力。这个系列的文章就是会见证我自己的一个成长过程!
思路虽然不是最优的,但是我会尽我所能!
为了让我自己的刷题之旅不中断,我特地建立了相关的仓库,来记录我自己的刷题之旅。 github.com/jackpan123/… 。