博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode算法题-Average of Levels in Binary Tree(Java实现)
阅读量:6597 次
发布时间:2019-06-24

本文共 2975 字,大约阅读时间需要 9 分钟。

这是悦乐书的第277次更新,第293篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第145题(顺位题号是637)。给定一个非空二叉树,以数组的形式返回每一层节点值之和的平均值。例如:

3   / \  9  20     / \    15  7

输出:[3,14.5,11]

说明:第一层上的节点的平均值为3,第二层上的节点的平均值为14.5,第三层上的节点的平均值为11.因此返回[3,14.5,11]。

注意:节点值的范围在32位有符号整数的范围内。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

使用广度优先算法(BFS)。使用队列来实现,在遍历节点的时候,使用了两层循环,外层控制层数,内层计算每一层的节点值之和,出了内层循环后,在外层循环里计算平均值,将平均值添加进数组中。其中有一点需要注意,计算节点值之和时,需要使用long类型,避免溢出。

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */class Solution {    public List
averageOfLevels(TreeNode root) { List
list = new ArrayList
(); if (root == null) { return list; } Queue
queue = new LinkedList
(); queue.offer(root); while (!queue.isEmpty()) { // 控制层数,其大小就是当前层数中包含的节点个数 int size = queue.size(); int count = 0; // 使用long类型,避免溢出 long sum = 0; // 处理每一层的节点值 while (size > 0) { TreeNode temp = queue.poll(); count++; if (temp != null) { sum += temp.val; } if (temp != null && temp.left != null) { queue.offer(temp.left); } if (temp != null && temp.right != null) { queue.offer(temp.right); } size--; } // 计算平均值,添加进数组 list.add(sum*1.0d/count); } return list; }}

03 第二种解法

使用深度优先算法(DFS)。在使用深度优先算法时,需要先将每一层的节点值之和单独算出来,同时还要存储每一层的节点个数,借助递归算法实现,在得到两组数据后,再使用一次循环,计算每一层的平均值。

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */class Solution {    public List
averageOfLevels(TreeNode root) { // 存放每一层的节点值总和 List
list = new ArrayList
(); if (root == null) { return list; } // 存放每层节点个数 List
count = new ArrayList
(); dfs(0, root, list, count); // 计算平均值 for (int i=0; i
list, List
count) { if (root == null) { return ; } // 判断是否还在当前此层内 if (deep < list.size()) { list.set(deep, list.get(deep)+root.val); count.set(deep, count.get(deep)+1); } else { // 新的一层 list.add(1.0*root.val); count.add(1); } // 递归调用剩下的节点 dfs(deep+1, root.left, list, count); dfs(deep+1, root.right, list, count); }}

04 小结

此题本质上是对二叉树的BFS、DFS算法的考察,在普通遍历节点的基础上,分层处理节点数据。

算法专题目前已日更超过四个月,算法题文章145+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

转载于:https://www.cnblogs.com/xiaochuan94/p/10536320.html

你可能感兴趣的文章
dp入门(先摆在这里,之后细细读)
查看>>
学生成绩的快速录入(构造函数)
查看>>
[Contest20180415]看无可看
查看>>
每次从vss获取文件都是只读
查看>>
Building tools为什么是主流
查看>>
Python环境搭建教程2
查看>>
python3-冒泡排序
查看>>
CODEVS1690|开关灯|线段树(带lazy)
查看>>
stage3D基础五-----Working with 3D cameras(转)
查看>>
Linux 安装python3.7.0
查看>>
CLGeocoder Error Domain=kCLErrorDomain Code=2
查看>>
Python 3.6 TypeEror: iter() returned non-iterator of type
查看>>
Azure AD Connect 手动同步
查看>>
day25 初始面向对象
查看>>
const与readonly
查看>>
史上最强超融合入门干货:超融合与传统架构特性及收益详细对比
查看>>
猜数字游戏代码
查看>>
常用sql语句总结2(conver()函数对日期的格式化)
查看>>
jenkins持续集成文件冲突的问题
查看>>
Python3入门与进阶【笔记】
查看>>