• 【树】最大层内元素和 层序遍历


    题目描述

    给定一个二叉树,该二叉树的根节点是root。对这个二叉树进行分层,根节点位于第1层,根节点的左子树和右子树在第2层。如下图所示:

    请返回元素之和最大的那个层号,如果存在多个相等的层则返回最小的层号。

    示例1:

    输入:root = [1,2,5,7,0,null,null]

    输出:2

    解释:

    第1层各元素之和为1

    第2层各元素之和为7

    第3层各元素之和为7

    由于第2层和第3层相等,但是第2层更小,返回2;

    解题思路

    这道题使用BFS是比较标准的解决方案(这里我使用队列,java中不用自己来实现对列),核心思路如下:

    参考上图:

    1. 先定义一个队列,Deque deque = new ArrayDeque();
    2. 将root放到队列中,deque.offer(root);
    3. 执行循环,跳出条件deque为空,循环逻辑如下:
      1. 计算当前层中各个元素之和,由于只有一个元素,计算结果为1;
      2. 将root的左子树和右子树加入到队列中。
      3. 比较求出元素之和最大的那个层号
    4. 直接返回结果。

    代码实现

    1. import org.example.TreeNode;
    2. import java.util.ArrayDeque;
    3. import java.util.Deque;
    4. class Solution {
    5. public int maxLevelSum(TreeNode root) {
    6. // 1. 创建一个队列
    7. Deque deque = new ArrayDeque<>();
    8. // 2. 将root加入到对列中
    9. if (root != null) {
    10. deque.offer(root);
    11. }
    12. int max = Integer.MIN_VALUE;
    13. int level = 0;
    14. int countLevel = 1;
    15. // 3. 执行循环,退出条件对列为空
    16. while (!deque.isEmpty()) {
    17. int sz = deque.size();
    18. // 3.0 准备一个sum,用于计算每层元素和
    19. int sum = 0;
    20. for (int i = 0; i < sz; i++) {
    21. TreeNode node = deque.poll();
    22. // 3.1 计算每层元素和
    23. sum += node.val;
    24. // 3.2.1 将左子树加入到队列中
    25. if (node.left != null) {
    26. deque.offer(node.left);
    27. }
    28. // 3.2.1 将右子树加入到队列中
    29. if (node.right != null) {
    30. deque.offer(node.right);
    31. }
    32. }
    33. // 3.3. 比较获取元素和最大的层
    34. if (max < sum) {
    35. max = sum;
    36. level = countLevel;
    37. }
    38. countLevel++;
    39. }
    40. // 4. 直接返回结果
    41. return level;
    42. }
    43. public static void main(String[] args) {
    44. Solution solution = new Solution();
    45. TreeNode root = new TreeNode(1);
    46. root.left = new TreeNode(7);
    47. root.right = new TreeNode(0);
    48. root.left.left = new TreeNode(7);
    49. root.left.right = new TreeNode(-8);
    50. System.out.println(solution.maxLevelSum(root));
    51. }
    52. }

    树的代码实现:

    package org.example;
    
    public class TreeNode {
        public int val;
        public TreeNode left;
        public TreeNode right;
    
        public TreeNode() {
        }
    
        public TreeNode(int val) {
            this.val = val;
        }
    
        public TreeNode(int val, TreeNode left, TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }

     

    总结

    这道题是一道标准的BFS题目,我借助队列来解决计算每一层元素总和;总体来说:需要掌握树的构造,树的广度优先搜索,队列的使用,最后是最大元素的获取;整体复杂度可控,是一个锻炼思路的基础题目。

  • 相关阅读:
    vue3学习 ref和reactive的使用
    在 Vue 的 mounted 钩子函数中使用异步函数是否会有风险需要考虑
    静态时序分析简明教程(五)]生成时钟的sdc约束方法
    偏微分方程的人工智能
    如何实现云数据治理中的数据安全?
    微信小程序 js中写一个px单位转rpx单位的函数
    python数学建模--sympy三维图像绘制
    TIA西门子博途V18安装教程及注意事项
    TypeScript(一) —— 进阶(TypeScript 中的类型、编译选项及使用 webpack 打包 ts 代码)
    CSS时间线样式
  • 原文地址:https://blog.csdn.net/weiliuhong1/article/details/126082327