首页 > 其他分享 >力扣刷题Days19-637.二叉树的层平均数

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

时间:2024-03-15 20:00:02浏览次数:19  
标签:node Days19 level queues 637 sums let 二叉树 root

目录

1,题目

2,代码

2.1广度优先遍历

2.2 深度优先遍历

3,学习与总结


1,题目

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

2,代码

2.1广度优先遍历

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var averageOfLevels = function(root) {
    // 广度优先遍历
    // 模拟队列
    let ans = [];
    let queues = [];
    queues.push(root);

    while(queues.length > 0){

        let size = queues.length;
        let numSize = size;
        let sum = 0;
        while(size > 0){
            let node = queues.shift();
            size--;
           sum += node.val;
            if(node.left != null){
                queues.push(node.left);
            }
            if(node.right != null){
                queues.push(node.right);
            }
        }
        ans.push(sum / numSize);

    }
    return ans;

};

自己完成的

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

略做优化 ,size变量的使用

var averageOfLevels = function(root) {
    // 广度优先遍历 (Breadth-first Search)
    // 模拟队列 (Simulate queue)
    let ans = [];
    let queues = [];
    queues.push(root);

    while (queues.length > 0) {
        let size = queues.length; // Nodes count at the current level
        let sum = 0; // Sum of node values at the current level
        for (let i = 0; i < size; i++) { // Ensure we only process the current level
            let node = queues.shift(); // Remove and process the front node in the queue
            sum += node.val; // Add the node's value to the sum
            // Add child nodes to the queue for processing in the next level
            if (node.left != null) {
                queues.push(node.left);
            }
            if (node.right != null) {
                queues.push(node.right);
            }
        }
        ans.push(sum / size); // Calculate and store the average value for this level
    }
    return ans; // Return the list of averages
};

2.2 深度优先遍历

/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var averageOfLevels = function(root) {
       dfs =(root ,level ,sums,counts)=>{
        if(root === null){
            return;
        }
        if(level<sums.length){
            sums[level] += root.val;
            counts[level] += 1;
        }else{
            sums.push(root.val);
            counts.push(1);
        }
        dfs(root.left,level+1,sums,counts);
        dfs(root.right,level+1,sums,counts);

    }
   
    // 深度优先遍历
    let sums = [];
    let counts = [];

    dfs(root, 0 , sums, counts);

    let averages = [];
    for(let i=0; i<sums.length; i++){
        averages.push(sums[i] / counts[i]);
    }
    return averages;
};

带注释版

class Solution {
  averageOfLevels(root) {
    let counts = []; // 用来追踪每一层的节点数
    let sums = []; // 用来追踪每一层的节点值总和
    this.dfs(root, 0, counts, sums);
    
    let averages = []; // 用来存储每一层节点的平均值
    for (let i = 0; i < sums.length; i++) {
      averages.push(sums[i] / counts[i]); // 计算平均值并添加到数组
    }
    return averages;
  }

  dfs(node, level, counts, sums) {
    if (node === null) {
      return;
    }
    if (level < sums.length) {
      sums[level] += node.val; // 更新总和
      counts[level] += 1; // 更新节点数
    } else {
      sums.push(node.val); // 添加新的层级总和
      counts.push(1); // 添加新的层级节点数
    }
    this.dfs(node.left, level + 1, counts, sums); // 递归遍历左子树
    this.dfs(node.right, level + 1, counts, sums); // 递归遍历右子树
  }
}

3,学习与总结

深度优先遍历逻辑回顾

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

勉励自己:贵在坚持!

标签:node,Days19,level,queues,637,sums,let,二叉树,root
From: https://blog.csdn.net/m0_51666362/article/details/136732958

相关文章

  • 洛谷题单指南-二叉树-P1030 [NOIP2001 普及组] 求先序排列
    原题链接:https://www.luogu.com.cn/problem/P1030题意解读:已知中序、后序,求先序。解题思路:与洛谷题单指南-二叉树-P1827[USACO3.4]美国血统AmericanHeritage非常类似,不在介绍过程,直接给出代码。100分代码:#include<bits/stdc++.h>usingnamespacestd;stringin,post......
  • 二叉树的垂序遍历
    说在前面......
  • 数据结构之链式二叉树
    当我们初步了解二叉树后我们就可以进一步去深入学习二叉树了1.链式二叉树的遍历这里我们先去定义链式二叉树的结构分为两个指针一左一右他们分别指向左子树和右子树typedefintBTDataType;typedefstructBinaryTreeNode{ BTDataTypedata; structBinartTreeNode......
  • 代码随想录算法训练营第day17|110.平衡二叉树 、 257. 二叉树的所有路径 、404.左叶子
    目录a.110.平衡二叉树b.257.二叉树的所有路径 c.404.左叶子之和a.110.平衡二叉树力扣题目链接(opensnewwindow)给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。示例1......
  • 洛谷 P5018 对称二叉树
    题目背景NOIP2018普及组T4题目描述一棵有点权的有根树如果满足以下条件,则被轩轩称为对称二叉树:二叉树;将这棵树所有节点的左右子树交换,新树和原树对应位置的结构相同且点权相等。下图中节点内的数字为权值,节点外的 idid 表示节点编号。现在给出一棵二叉树,希望你找出......
  • P8681 [蓝桥杯 2019 省 AB] 完全二叉树的权值
    题目描述给定一棵包含N 个节点的完全二叉树,树上每个节点都有一个权值,按从上到下、从左到右的顺序依次是​,如下图所示: 现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。注:根的深度是 1......
  • 二叉树
    节点类定义classTreeNode{privateStringvalue;privateTreeNodeleft;privateTreeNoderight;publicTreeNode(Stringvalue){this.value=value;this.left=null;this.right=null;}publicvoidsetLeft(Tr......
  • 第六章二叉树——二叉树的最大深度
    吾日三省吾身还记得的梦想吗正在努力实现它吗可以坚持下去吗目录吾日三省吾身力扣题号:104.二叉树的最大深度-力扣(LeetCode)题目描述:思路解法一:递归实现思路代码逻辑解释注意事项代码实现内存优化总结(╯°□°)╯︵┻━┻(⌐■_■)(¬‿¬)(´・ω・`)(͡°͜......
  • 236. 二叉树的最近公共祖先c
    /***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*/structTreeNode*lowestCommonAncestor(structTreeNode*root,structTreeNode*p,structTreeNode*q){......
  • leedcode-完全二叉树的节点个数
    自己写的,使用广度优先BFS,迭代:classSolution:defcountNodes(self,root:Optional[TreeNode])->int:#如果根节点为空,则树中节点数为0ifnotroot:return0#初始化队列,并将根节点放入队列中queue=[root]......