LeetCode_二叉树_中等_515.在每个树行中找最大值

x33g5p2x  于2022-08-17 转载在 其他  
字(2.1k)|赞(0)|评价(0)|浏览(412)

1.题目

给定一棵二叉树的根节点 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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-largest-value-in-each-tree-row

2.思路

(1)层序遍历
既然要找出该二叉树中每一层的最大值,那么可以通过层序遍历的方式来进行寻找,在遍历每一层时,使用遍历 curMax 来保存当前层的最大值,在每一层遍历结束后,将 curMax 加入到 res 中即可,遍历结束后返回 res。具体的遍历细节可参考102.二叉树的层序遍历这篇文章。

(2)深度优先遍历 (DFS)
具体细节可看下面代码中的注释。

3.代码实现(Java)

  1. //思路1————层序遍历
  2. /**
  3. * Definition for a binary tree node.
  4. * public class TreeNode {
  5. * int val;
  6. * TreeNode left;
  7. * TreeNode right;
  8. * TreeNode() {}
  9. * TreeNode(int val) { this.val = val; }
  10. * TreeNode(int val, TreeNode left, TreeNode right) {
  11. * this.val = val;
  12. * this.left = left;
  13. * this.right = right;
  14. * }
  15. * }
  16. */
  17. class Solution {
  18. public List<Integer> largestValues(TreeNode root) {
  19. List<Integer> res = new ArrayList<>();
  20. if (root == null) {
  21. return res;
  22. }
  23. //queue保存层序遍历过程中每一层的所有节点
  24. Queue<TreeNode> queue = new LinkedList<>();
  25. //最开始的第一层只有根节点,故先将根节点加入到队列中
  26. queue.offer(root);
  27. // while 循环控制从上向下方向的遍历
  28. while (!queue.isEmpty()) {
  29. int levelSize = queue.size();
  30. int curMax = Integer.MIN_VALUE;
  31. // for 循环控制每一层从左向右的遍历
  32. for (int i = 0; i < levelSize; i++) {
  33. TreeNode curNode = queue.poll();
  34. curMax = Math.max(curMax, curNode.val);
  35. //将下一层中的所有节点保存到 queue 中
  36. if (curNode.left != null) {
  37. queue.offer(curNode.left);
  38. }
  39. if (curNode.right != null) {
  40. queue.offer(curNode.right);
  41. }
  42. }
  43. res.add(curMax);
  44. }
  45. return res;
  46. }
  47. }
  1. //思路2————深度优先遍历 (DFS)
  2. /**
  3. * Definition for a binary tree node.
  4. * public class TreeNode {
  5. * int val;
  6. * TreeNode left;
  7. * TreeNode right;
  8. * TreeNode() {}
  9. * TreeNode(int val) { this.val = val; }
  10. * TreeNode(int val, TreeNode left, TreeNode right) {
  11. * this.val = val;
  12. * this.left = left;
  13. * this.right = right;
  14. * }
  15. * }
  16. */
  17. class Solution {
  18. // res 保存最终结果
  19. List<Integer> res = new ArrayList<>();
  20. public List<Integer> largestValues(TreeNode root) {
  21. if (root == null) {
  22. return res;
  23. }
  24. dfs(root, 0);
  25. return res;
  26. }
  27. private void dfs(TreeNode root, int curHeight) {
  28. /*
  29. res 中的下标表示二叉树中的层数(从 0 开始),下标对应的值表示该层中的最大值
  30. */
  31. if (curHeight == res.size()) {
  32. /*
  33. 如果 curHeight == res.size(),那么则说明 res 还未保存当前第 curHeight 层
  34. 的最大值信息,所以直接将当前节点值加入到 res 中
  35. */
  36. res.add(root.val);
  37. } else {
  38. // 更新当前层的最大值
  39. res.set(curHeight, Math.max(res.get(curHeight), root.val));
  40. }
  41. // 搜索左子树
  42. if (root.left != null) {
  43. dfs(root.left, curHeight + 1);
  44. }
  45. // 搜索右子树
  46. if (root.right != null) {
  47. dfs(root.right, curHeight + 1);
  48. }
  49. }
  50. }

相关文章