• 力扣刷题Days19-637.二叉树的层平均数


    目录

    1,题目

    2,代码

    2.1广度优先遍历

    2.2 深度优先遍历

    3,学习与总结


    1,题目

    给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。

    2,代码

    2.1广度优先遍历

    1. /**
    2. * Definition for a binary tree node.
    3. * function TreeNode(val, left, right) {
    4. * this.val = (val===undefined ? 0 : val)
    5. * this.left = (left===undefined ? null : left)
    6. * this.right = (right===undefined ? null : right)
    7. * }
    8. */
    9. /**
    10. * @param {TreeNode} root
    11. * @return {number[]}
    12. */
    13. var averageOfLevels = function(root) {
    14. // 广度优先遍历
    15. // 模拟队列
    16. let ans = [];
    17. let queues = [];
    18. queues.push(root);
    19. while(queues.length > 0){
    20. let size = queues.length;
    21. let numSize = size;
    22. let sum = 0;
    23. while(size > 0){
    24. let node = queues.shift();
    25. size--;
    26. sum += node.val;
    27. if(node.left != null){
    28. queues.push(node.left);
    29. }
    30. if(node.right != null){
    31. queues.push(node.right);
    32. }
    33. }
    34. ans.push(sum / numSize);
    35. }
    36. return ans;
    37. };

    自己完成的

    一时忽略了size的减1 变化 导致代码出错

    略做优化 ,size变量的使用

    1. var averageOfLevels = function(root) {
    2. // 广度优先遍历 (Breadth-first Search)
    3. // 模拟队列 (Simulate queue)
    4. let ans = [];
    5. let queues = [];
    6. queues.push(root);
    7. while (queues.length > 0) {
    8. let size = queues.length; // Nodes count at the current level
    9. let sum = 0; // Sum of node values at the current level
    10. for (let i = 0; i < size; i++) { // Ensure we only process the current level
    11. let node = queues.shift(); // Remove and process the front node in the queue
    12. sum += node.val; // Add the node's value to the sum
    13. // Add child nodes to the queue for processing in the next level
    14. if (node.left != null) {
    15. queues.push(node.left);
    16. }
    17. if (node.right != null) {
    18. queues.push(node.right);
    19. }
    20. }
    21. ans.push(sum / size); // Calculate and store the average value for this level
    22. }
    23. return ans; // Return the list of averages
    24. };

    2.2 深度优先遍历

    1. /**
    2. * @param {TreeNode} root
    3. * @return {number[]}
    4. */
    5. var averageOfLevels = function(root) {
    6. dfs =(root ,level ,sums,counts)=>{
    7. if(root === null){
    8. return;
    9. }
    10. if(levellength){
    11. sums[level] += root.val;
    12. counts[level] += 1;
    13. }else{
    14. sums.push(root.val);
    15. counts.push(1);
    16. }
    17. dfs(root.left,level+1,sums,counts);
    18. dfs(root.right,level+1,sums,counts);
    19. }
    20. // 深度优先遍历
    21. let sums = [];
    22. let counts = [];
    23. dfs(root, 0 , sums, counts);
    24. let averages = [];
    25. for(let i=0; ilength; i++){
    26. averages.push(sums[i] / counts[i]);
    27. }
    28. return averages;
    29. };

    带注释版

    1. class Solution {
    2. averageOfLevels(root) {
    3. let counts = []; // 用来追踪每一层的节点数
    4. let sums = []; // 用来追踪每一层的节点值总和
    5. this.dfs(root, 0, counts, sums);
    6. let averages = []; // 用来存储每一层节点的平均值
    7. for (let i = 0; i < sums.length; i++) {
    8. averages.push(sums[i] / counts[i]); // 计算平均值并添加到数组
    9. }
    10. return averages;
    11. }
    12. dfs(node, level, counts, sums) {
    13. if (node === null) {
    14. return;
    15. }
    16. if (level < sums.length) {
    17. sums[level] += node.val; // 更新总和
    18. counts[level] += 1; // 更新节点数
    19. } else {
    20. sums.push(node.val); // 添加新的层级总和
    21. counts.push(1); // 添加新的层级节点数
    22. }
    23. this.dfs(node.left, level + 1, counts, sums); // 递归遍历左子树
    24. this.dfs(node.right, level + 1, counts, sums); // 递归遍历右子树
    25. }
    26. }

    3,学习与总结

    深度优先遍历逻辑回顾

    • 搜索过程中需要记录当前节点所在层: 初始从0层开始递归遍历,没深入一次,层数level+1;
    • 访问到第level层,判断是否有该层的信息:level < sums.length
      • 如果已有记录,则进行累加;
      • 如果第一次遍历该层,就为这个层级添加一个新的记录;
    • 内部要继续调用dfs函数,实现对整棵树的 遍历;
    • if( root === null )在递归中 充当 结束的条件,和判断 初始输入的数是否为空 不一样;

    勉励自己:贵在坚持!

  • 相关阅读:
    pcl 基本数据类型
    注解汇总:Spring 常用的注解
    RabbitMQ学习一 安装
    编程狂人|Go内存管理一文足矣
    亚马逊买家号白号批量注册怎么做?
    别让 Linux 成为拿offer的阻碍
    十二、Sequential
    用Vue编写一个简单的仿Explorer文件管理器
    微服务低代码Serverless平台(星链)的应用实践
    《算法通关村第二关——指定区间反转问题解析》
  • 原文地址:https://blog.csdn.net/m0_51666362/article/details/136732958